管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
' p$ {- R7 }- r5 ^/ i0 \6 P' ]: t- T! @/ M
一、数据插入 - INSERT
# K O; s5 _ [6 c% E. ~4 Y% y v/ i/ C2 E: {' a+ [' R1 o9 N5 h4 E
1.1 : DLang 插入数据
" a* W: C* l6 r& d, b( Y/ ~
% e2 z h9 e0 V. D( P8 ]0 Rimport std.stdio;
6 {& c$ Q, u( C" t# A" z S2 L5 P$ ? \/ ~6 B5 N/ S1 `4 j( A
import hunt.database;
0 Z. P9 V$ ^' e1 m+ q, u
: z1 ^: M$ x; |1 evoid main()3 Y6 ]8 y6 ]5 B( H2 {& }
( J* |& a' j" g{0 y* u1 g1 T1 [' O. c' R! P" Z
8 ~, b/ E$ a" w, h' E8 f) B
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
- R0 U' b2 k7 |- v- |: A$ G3 n( C: r1 @* l4 M
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
7 ~9 U' X5 C/ \9 l. k0 N- [& M" A( y4 D: D$ D" c1 F& Y
// 打印插入数量% j+ w( |5 ?# S) y' X1 G% s+ t( a
/ U1 h; w! U) }3 C2 |writeln(result);
( A4 q! H: ] \2 s5 Q# x
1 Y4 \% c/ d, fdb.close();1 H$ E$ M* E% `1 `, d, {1 D
9 w/ I. C$ w. [ A$ ~}
+ z( p7 H7 s$ s/ |- C% Y* M; j6 h6 k: V+ `# l) k% y& }
1.2 : Rust 插入数据
& h. }3 r& y" r" E
/ F; h0 }, l3 y Bextern crate postgres;3 ?4 _0 i0 ~% v
: O. {3 W" x. ?2 k7 r
use postgres::{Connection, SslMode};
$ i( h) U: a& E9 y6 \$ ?1 R) O+ @1 Q) v+ O1 f$ p
fn main() {
, D* I4 M/ B3 ^$ x, l. v7 ~% y
+ R0 |7 g: \- C9 U* k2 \let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();& W1 Q2 k" ~4 U1 C& {3 n3 M: ~
- m" U4 `; L9 G0 F9 u2 K. e9 M5 }
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();' X+ Z; q2 h8 u
I8 G8 {6 Z; E, @; e/ u}
9 I$ x( \& s3 o! n. k9 i5 P3 ~3 C. _# I
1.3 : Golang 插入数据% e' z$ E% Z+ M; F
. ^& L$ Q% g5 C4 f7 ?, uimport (8 k( U; n& s- q( d1 L; |+ ?
; v( e B3 F; k4 w) G
"database/sql") {3 w1 X( k0 h$ f8 J- H2 j
$ X, ~/ O, R2 I& x
"fmt"4 h& b" v2 e; T: L
, m7 i" z, \/ M2 @$ D( y
_ "github.com/lib/pq"
* Y2 G: L3 B& B/ N
/ k( X0 a! `( n4 L1 Z"time"
/ s& b( d1 F. m1 C; ]; |7 I; A; M* Q1 _" D& H& P4 O
"log"
- @7 a/ V, A# y& p( I" j$ ~# C
' u3 A8 n- U4 D8 d; m)
+ F& P% ]: Z( ^0 n, v$ ]; e( g3 w, l5 j- t
func main() {
! R: |/ D2 F# H0 F+ C% }3 `3 q1 ~: u' ~
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
. O* x& d g; q; N" @
; x* X; p$ z3 k& W9 W4 a5 w8 W6 `if err != nil { U; P& U% [: L+ Z+ V
' N- v P) M( e3 E' h
log.Fatal(err)
+ M7 x* B% {) _* L
- Q. v6 u; V+ T0 l v- `return nil
: {8 J" @0 [# D; O, I: T. x( @ a1 ~( ?8 a
}% ]. g* G2 ~/ I3 z! \" I
; ~+ g! Z4 c* `4 B }2 t8 {7 Pstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
! d2 q* s7 A/ M- w* x5 g: i2 I, I ^" E
stmt.Exec()5 [. z: ?, K& H2 q! }
+ i2 \* g% D% r' lstmt.Close() m6 |( f+ ]1 q, R* Q- P
- u" Z9 M m8 L+ K! X
}
c" ~# {- }9 _4 z6 m$ G6 V& A
; g- n. @4 V {5 d9 Q二、数据查询 - SELECT: S/ H( F+ }( P* m" l- H
8 A; U0 e% e1 |) ]- Y' h2.1 : DLang 查询数据
/ I; s& D A9 s- t m' x. i8 M1 M& p; |/ A* J l$ m$ I
import std.stdio;4 q, U. ^' z- c w
7 ~+ s. J8 ~& a* S
import hunt.database;
- @# \8 x; \8 x) [( F* p r6 L
) @* h9 Q8 Y4 ~5 U4 t( Dvoid main()1 n! c* k: b/ T- Z; @6 i8 g! R
/ a5 P7 k" E+ W& J
{
! z9 A7 Q; q3 A7 H0 v4 p# M0 Y1 I# i' z0 O
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
" U: M9 M: [9 y3 I: {. W( |
, w% @* O7 F% a0 m8 [foreach(row; db.query("SELECT * FROM user LIMIT 10"))
% U/ a ^' X) R- O
$ o+ y# {: E7 @$ I{" P4 m3 F) D! _% V
2 @7 n8 f( G9 A% W- h+ z; H/ t
writeln(row["username"]);3 X# c; _/ g! o2 r3 }
8 V% N( |! k6 S
}
: \- [( g* w+ W* l z1 N+ p% r2 H# e0 `+ u/ i* {
db.close();5 x, F; j- O7 ]0 S
" @( W7 K Y% \+ Y" h3 c# {* m5 w
}+ U+ b* @% R3 K
# @' E4 o5 c0 l, @' r, L2.2 : Rust 查询数据
+ c6 j( L! |1 k% n- {, C1 D, `
7 e' S# J0 A6 ?/ q# K. dextern crate postgres;7 ]; b! I8 k8 w9 l& N6 Q8 g
3 @0 Y! m- i, ~7 v" b# ^' ~) d) Q2 b$ [use postgres::{Connection, SslMode};
- c3 M8 b3 [/ I7 K. V4 v. X( Y9 E5 d9 }! @ G# U' l1 r
fn main() {
- G- b1 t# K! Y. \' E! r! r
7 ^0 S% v1 I3 J* a7 s$ alet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();+ K }1 b, ^3 K
3 x' |. S, h8 @3 ^for row in &conn.query("SELECT * FROM user", &[]).unwrap();% y2 X8 P# ?7 t
7 Q3 ?" l, [: T: S6 E
println!("Found person {}", row.get(0));
. Q1 u* ?8 _& H1 m/ u( x) B" v* h T- ^- K/ ?5 F
}
) Y" \/ B' i& O1 L4 Y
( }* H: O! c$ B2 ?7 a& Z}' h* Q) j& r: {5 w; j' a
& e7 ^5 G/ `7 Z9 e L4 _6 q3 k: e+ s
2.3 : Golang 查询数据
/ \ c8 Q* ], Z5 D' i
1 q& D3 w! `# j$ Oimport (; I4 c: ?) L0 }8 _# x+ m' P3 q; L
1 P6 y! w7 E7 n5 i
"database/sql"3 x4 y4 U2 y9 n& x
8 m- m: A" I: E4 `8 I
"fmt"
5 Z W4 r$ t+ ^
7 o* Y6 ]; M7 l$ ?& N9 H6 u) P_ "github.com/lib/pq"( `$ B0 z, z5 V
3 J2 c. C( X; S"time"4 J+ R7 k/ Y. f! T! B4 N
0 J, N. S, }# d4 L) b
"log"# y o* N* h ~
' |& I5 O# O* I$ ^)
. _& g5 v2 | j" h+ q: h# C, y4 @# E" t" g- x' m1 O) h' K9 L7 J
type User struct {/ _ o1 V; d4 t; m1 h; R; `
9 _9 k4 V3 S3 I8 a* J2 H* w6 k
UserName string
6 L& }" @9 R' u. J- a6 _6 l) |0 _- z1 G# I. c. v/ g
}
3 h& \4 J% Q/ c
+ ~1 e! M+ ~2 W) O6 o. i8 t' Ffunc main() {
; R3 _- A& K8 n* B- G3 o% N& o8 W
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")5 b' D) m# G) R/ t
* o6 d: d/ R9 k' \1 N4 {
if err != nil {6 i0 N9 V6 O& {2 l2 u
/ I. s8 c3 {% Z2 d8 L$ }
log.Fatal(err)
. b9 I' `! g9 M4 ~- ?' `$ s( h1 ?6 H# ?( k7 ~3 v( o+ q
return nil* I; l& I7 n) U8 p: y; J0 I
: E) ^9 \3 Z" T2 e' }
}# ~5 H3 S7 h0 `7 Z" a$ ^
$ ?! V- r. z% \( q; ruser := User{}# J& L' P9 R) T
# L1 l- r; `$ l9 V2 v; f4 W: Q
stmt := db.Query("SELECT * FROM user"); Q) F; d+ Q* N6 a) b) A2 k
; d8 U% Z! P0 }" [2 Vfor rows.Next() {, u3 n% V8 M* c$ M! N
( p) [5 h9 `6 i1 j9 e+ y
rows.Scan(&user.UserName) g" A e0 N( G7 L
" m2 z9 I; K- F& qfmt.Println(user.UserName)3 G% K# f7 E w* a% a* o
' i9 m& g7 r# |
}8 Y+ F3 \1 F4 x3 A
* m8 X% g. u5 t6 kstmt.Close()
4 c0 E" a; O: S' W; W/ a$ g2 f O" W2 j- F: ?% \
}1 S3 ]2 P5 d1 \% `. X% G5 D) j
6 ^5 s/ q* k1 H# X6 Z& n/ K" Q8 o三、总结
8 l3 N! p! d* U% v$ A6 u2 U! p/ M! L: n6 \3 o) _4 \
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
& f- A# G8 B9 S0 u2 q- T( p
+ ^$ e! i. y! m- s$ K6 l6 d这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
8 d! N- e" a3 W q/ @* t- g* n. ]1 D3 t3 g; j3 J
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
* [; B S2 l9 w( b3 o: T
" Y, G' E' _5 {$ u( l" r总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。% e7 A% Q' G/ e4 s# G
————————————————1 M& E/ a1 \* F2 _. i! [* _ h6 B
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' c7 M5 y, p+ b6 B" ]原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961% t! A0 }* s: K9 B* ^! i
4 [3 \4 h4 G& j4 k2 S |
|