管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。" `+ i" W4 X9 A, X2 \) n0 W
( _* a/ |- w, s# h Q+ p
一、数据插入 - INSERT
& y2 A/ v% R% Q+ y* Y! V5 M% S
8 R; j( K b4 k# f: }( ]2 w& ^ }1.1 : DLang 插入数据# I7 a5 ]/ q- i) d5 f: j6 B! [
% J; `& p' |& Y) n
import std.stdio;
* u7 |1 k6 N0 n, t' H G1 Z/ i4 S- G5 @: t! A+ Y; \ `" A
import hunt.database;/ ~8 J5 ^( N [+ B5 G" d
. p9 k0 r. ^# q$ T# t( yvoid main()
) _+ [0 |; B; U6 P
7 j9 C9 l1 l( q- a2 z$ V3 U{
2 x, K& U9 p( a5 x- O2 m
8 F! q* j, F* i: S3 c) Qauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
$ F4 e. u5 R% H) j* t6 B
+ o' J; f" {- o9 n$ O+ Tint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
8 k( `: H7 P3 V
! i0 Y ]7 ~- J" @/ d// 打印插入数量
2 ~% ?* D& X. a. D) `7 S) N& [; b; I+ k' s0 l
writeln(result);4 ~; R& |8 j8 S! l2 p+ I; K E
0 x! P; p. |0 p5 f% wdb.close();
. D& B1 c& }% `( }" ]8 r$ [7 Z' X
}
. x I% F: q: D, B! `2 w+ D; u! s- j( S; N- g3 s" ~3 |6 h
1.2 : Rust 插入数据
P7 F7 g1 M# f2 P0 D
% H8 v g3 p4 m. o! Q2 Mextern crate postgres;
4 o8 @& G0 z+ t
8 _5 U" N& X3 I6 e% m) Cuse postgres::{Connection, SslMode};
8 J Y3 D+ o$ ^1 o5 Y% |9 [/ `* n# w7 ~6 Y& q
fn main() {* r2 w9 Y5 c& f. v8 W1 b
( s2 a5 ?' }$ E+ |6 [let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
! a: J! P7 \! E; b% ]. b: G2 C% d% I3 \- R1 L* l$ R
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();" _4 e9 S0 |8 E; y
# @* Q! D" |. T" ~( ?" T
}
0 e) @$ k" m" }- P; b( N8 o
( |2 H1 g: Q/ y9 O# G& w1.3 : Golang 插入数据
) ~: `$ R* \8 ^- Z( H( `/ H# I. c
+ I+ g( ~) M$ i- e4 N. n/ e& himport (# v7 l4 X2 ^1 g6 ^& o ]
$ I% b. ^ B) J/ @" v1 f* _1 T"database/sql"
6 {- \! D8 [5 J9 U R, k# c( S2 c4 Z' w0 f3 N
"fmt"
& {8 j: `- p1 `( J( P' m( A; h6 L- k2 g4 P* f6 f! l5 [
_ "github.com/lib/pq"
& n6 @2 d9 z4 m1 _/ B0 j( e9 _- G* B$ W6 q, d% z
"time"( B3 I8 e5 Z, i: `" l3 }
* |! m5 U7 U# h( p+ e6 C* N: w"log"
$ @; k3 n" b/ r, C. M- P) n6 Q1 k. | o) f7 X0 B5 C
)
5 Z$ N, }8 p+ }1 k3 ~; x: a. X" `' j$ ?- Q3 X
func main() {, t" @% x/ N0 e2 q5 X, P
( M5 J e5 I- s6 s( T6 a
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
# n* L9 E8 }& j/ R0 k, y
* ?5 z2 V% i x! X, Oif err != nil {
8 ]3 N9 Q' O# f: ?% s: D0 b4 {3 J0 }5 f Z
log.Fatal(err)
2 G- j; x0 Z- ]" _
( _$ j% M; y; M1 b6 ]/ ]' P6 R9 Xreturn nil1 D! [1 z5 n5 c+ `1 n/ b
: g4 L6 y/ K4 I}
0 X7 S6 B! B( v J& O# l
# }4 m6 ]" h, W8 j% n) Kstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
4 E& K( t' M l/ T$ D- @1 f
$ v$ M! F0 q3 B) ~) }stmt.Exec()
0 j# M, w1 R8 Z
. @; x5 G8 H0 C; `& gstmt.Close()( Z6 e b. r+ I2 t; O
; ]4 j& B6 V `. \. W' @}- O( E& A+ ?- D/ ]
7 m t7 N5 g- B- F2 i; Q b4 U
二、数据查询 - SELECT
5 B! V2 z( D( n7 l! ^7 n4 w$ j1 t* D5 j0 Y
2.1 : DLang 查询数据5 r: h8 t% O# i2 Z# {
- e& u0 @4 d! h8 kimport std.stdio;- }1 |* y U) V1 i4 P
0 ~) E- ]# E3 e7 w1 u+ L1 |5 _8 Z7 `2 nimport hunt.database;
6 O2 ^+ D8 ]# r2 e% J2 Q4 d7 k$ M
3 f' R( f- V. g8 G$ o6 Pvoid main()
( H7 j( g. m& n L5 D" {1 y6 ^ a& c5 c! o
{
9 h$ g8 f6 [+ {. N/ N& ?, B% |' p6 O
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
3 {' x# ]0 a% q8 s. ~4 T" P+ h3 D+ ?& G7 Q, v2 g- {3 e
foreach(row; db.query("SELECT * FROM user LIMIT 10"))/ E4 _! @- q: U% ~/ w
# \2 E5 W$ p( u5 g3 f{
# |; r# ^2 S& S S; B, h
9 @' o; W- _/ `0 vwriteln(row["username"]);
! j5 c j9 M1 f9 Q
: s6 y+ q1 N/ x [& a: q/ e}
$ D# Z4 U, z2 Q& x0 {4 ]
! x1 B/ C- D0 m/ w9 Ddb.close();; I, f1 w6 C# I+ I' A* h1 q4 U
2 c# [" Z! g s3 x& Y- j
}
0 u3 P9 i7 J* w6 m
0 x+ j8 }. c9 e6 \7 n2.2 : Rust 查询数据$ X- J( J* i. F' ~0 i& e$ Q5 X
& X# l/ q8 O3 i7 }$ o( L2 d' W+ @
extern crate postgres;
6 s% d! l5 z7 J. o$ u2 I7 r$ m i1 e0 s. a( m7 Z1 h3 R
use postgres::{Connection, SslMode};
, a3 Q2 [" f5 p- G: G# a3 r
4 T: c" E5 h. s+ A; Tfn main() {; g4 ?" u, S( e0 j2 D9 J# L- f
# S G( f# D6 k; f! B
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();2 ?; d; T/ a% L; S4 Z
4 k% P b) w$ V
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
/ ` ] I6 ?8 f1 ]1 |2 f6 e6 \. S3 L p4 x; K; D
println!("Found person {}", row.get(0));
1 Z" K( Q [: y5 B( y4 d
; h5 j* F5 W8 q2 e6 l! @5 i}6 ^. d: p& Q9 J
" e# ~& R; j9 g9 O: }
}
" S0 y V( |8 Y0 g: S
; m- S7 d) c4 H2.3 : Golang 查询数据' e2 \! E4 A: U% a( d2 Y) c! z
! c5 D. x* P) J# u3 |
import (3 W) @9 y1 F$ K- Q
4 h$ O# \6 J/ @5 k# j+ H9 q; D"database/sql"! c8 ^! G# e/ ?4 C! B6 K f9 X8 M
' V( d6 q, a% G4 i4 @"fmt"
4 i) E" v' t' K) R8 T. j* |
8 P/ A: @2 g6 I. A! x' p_ "github.com/lib/pq"
3 b. d, D. ~. W3 ^; z1 w
# T; m9 {4 v. \7 a* n"time"1 m; h: G1 V5 ^. f
& J# w' R+ l3 P) @
"log"
0 @) `1 n$ Z1 P- _
! B6 J: @# z- G; c+ W)" ?% B0 G' E5 Z
) F9 E; S! P% M: D1 M, X9 o1 Jtype User struct {
' J, I1 T3 _$ k5 F1 _ j, j, _# I- U0 f' K; @) U
UserName string
2 D+ S" J' k* d! t( A4 |
" Y' @9 ]2 d, i$ O}
; i& V( P& _& ?; l t. ?' J
0 [- C! l( B* \6 \8 Kfunc main() {
+ w N/ X! A7 T0 Z8 ]8 S& U
: m' @3 I3 ^& u- [+ U1 cdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
! z* y2 K9 z8 u* x) n, w/ Z: G& n; G2 D1 M% Q1 H
if err != nil {. N5 @( E. v5 }* i; L1 M3 `
/ U2 W+ w/ U+ ~9 S3 @( N# |2 J% xlog.Fatal(err)5 A: z ^, l/ k6 i
* V3 u M+ ?- Y# greturn nil
, _& S* l5 x( P) W, K' D9 ?& {. U
A! K& m6 m' o+ _}
3 t+ j( k& N) B
7 t2 n3 ~) a6 w- I3 k4 t; Uuser := User{}: o2 f' [3 C7 U
6 U5 O8 m4 Y; l6 e7 j' j) Gstmt := db.Query("SELECT * FROM user")3 d' h3 c- W5 o
. p. ~- g1 E# h) e Q2 H7 Efor rows.Next() {' t T6 G1 a- E0 O0 o
3 J8 L2 s5 |2 b- I A9 R
rows.Scan(&user.UserName)2 s' g0 ~: x' t! n O% C5 S
$ @ l3 ^% z0 N6 |" x2 w) lfmt.Println(user.UserName)1 h; E/ ^9 q% U' Z. V# \ Z
( ~6 w* L8 e: g6 H# o1 n}6 I; C3 L X) H3 ^8 \& q O# o% ~
3 w1 s6 G9 ]9 B( r2 Z2 m9 G
stmt.Close()- E: g+ V" H2 [9 z1 ?" F
! X4 K7 |3 b. G4 ?3 \
}
' M' K( C0 z( T3 s9 ~
) k/ T7 A5 v) {$ R7 E三、总结
; c# N3 ?7 ?* R8 L! ?' D5 c7 f6 I% ^$ S5 M& q+ _# Q) `; C+ F% S
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
k% }1 p9 f' R8 S. C
- k% }8 Z' |8 q/ P5 N ]这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)# y4 O5 ]* A2 E6 L
- [: C/ E/ _" V3 }- _) A& I; Q
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
) g, W2 w& P" W% X: a) T
, v" g3 k9 J; U" h% a7 I* Z总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
) ^) f6 @7 T a2 Y6 \————————————————5 }' b/ n F; F9 x: X
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 A# Z+ L$ b- v: C7 U原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
h* m9 A0 g+ Z
6 `; z+ ~9 ~& e" ]/ p" |6 D* S9 H |
|