管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。! c* Q1 u# m4 h0 j% V) w9 Y! ]
_/ ~: L# D/ Q! Z% w/ U C: Y" T
一、数据插入 - INSERT
/ y, M& F B6 [; D9 I7 ]% M
9 u0 ^6 x7 d- ]) B4 H8 b1.1 : DLang 插入数据
! N4 q5 F/ a, X6 t2 Y1 Y8 w1 m/ f3 q4 L; }4 ^0 n, H
import std.stdio;# P! u) v) H( X
, H5 X, I; R" z5 r* c+ g! V3 ~import hunt.database;
; x6 o w2 e8 g6 i; `" U. @
; x+ ?6 p1 l, }void main()* c8 A: B$ y- @& Y+ G! T
: y3 J1 l- c4 d8 r{, ]. ^8 U* ~( ?
; ]7 t. _0 ^1 d7 j0 N3 Q* Iauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
5 t" Q/ _6 e$ Q+ K- h2 I5 ~) `
- A6 ]* i4 H) aint result = db.execute(`INSERT INTO user(username) VALUES("test")`);, B3 b U7 ~+ {
$ d l3 S, V i
// 打印插入数量9 z3 Q, j6 W: B1 A4 W, n3 p
3 P; T2 ~" _) {5 a. G+ O* q/ Twriteln(result);
% k" E6 `1 m$ J* [ U
0 e/ r, f$ `, B1 T- Z) adb.close();$ b* |4 G9 ~" Y _. f( M2 U
* d# ^9 N, S$ Y}
9 l3 n6 j; Z6 l9 Y U, N& L6 ^
# Q1 f+ P# @' g( V1.2 : Rust 插入数据- W# v/ z- I! x1 D3 ~* D4 }* ?8 t9 f
$ m; ]! D" J- ^6 g1 H* jextern crate postgres;
$ a+ v: T. D0 ?) J* X3 R8 Z7 F5 y
use postgres::{Connection, SslMode};) z6 P- q, T4 [" [ R$ Y
% }: y' F) L, f* \* M- Z' u
fn main() {
4 D) a; B% ?$ q8 d1 y; i0 ~3 F& v" A5 ^7 u
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();1 O4 e& f+ U2 ?# O
+ S2 O X3 @- b# U: U
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();2 L ]3 X: W# C( N( S% G- w
( J5 g, E% `* u* O% b9 i}; a' q% H6 Z4 V. V: U* K
2 S, | }/ L$ R7 I$ h4 U0 \
1.3 : Golang 插入数据. Q1 Q" K3 A7 g$ p
$ F* _" R" W: W& ^, ]5 Aimport (6 c/ W. e$ V; C
3 g/ p. Y" @3 r7 H$ ~
"database/sql", A% F. U4 k [: s# p& F+ N9 H. n
# Y% e' u" q+ ^$ U7 Q+ V5 s' h"fmt"$ {0 J# k/ r j( R- `
6 d% V# o- W! P# Q
_ "github.com/lib/pq"
# A+ H- S, t& P+ w& D
% k* S7 |8 t5 S. M/ S+ U"time"
* ?& p' l- q+ t2 a/ L9 H# K: j) S: E' D4 B# o' _! K$ c
"log"
* g/ U$ C# [6 l, c) e' y
$ o& [1 {, F/ M) h5 j1 j( t)' D, g4 z0 q2 ~0 W; C
T8 M" w$ T& Y
func main() {/ P$ b' g& P1 |. B, s$ ?7 V
) z) I" {' E2 \/ M! q9 K) D
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
* ?* N9 ^- y( F' _
- W. k' ]$ _$ i1 k% Tif err != nil {
& d5 J( P, {6 a2 y& N, t& [- h+ d. g9 d1 P+ y) l
log.Fatal(err) C5 d$ Q0 k& t$ n, [: X( I
1 b9 M# q* i; s3 Greturn nil# R" M* B3 I9 }% X* g
& r' G6 F5 W& o9 \& ^* u
}/ z1 {; L, M9 Z% G5 H. }/ o& _
5 ~2 P4 x v: P( V% O0 W! L' l
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
+ h; o r6 y. V2 T
* M) v5 X5 V& C1 j# _+ Estmt.Exec()# I! R( j7 Z" o# p3 c
* m5 T( S9 H0 j; o lstmt.Close()4 }/ Q% K1 H k1 `' J
7 G: n- z8 T* S" [
}
' A3 d! w+ ~* G% D9 H
_+ x: b: l% S+ ~. o二、数据查询 - SELECT2 w3 ]/ R6 @6 p' p5 b, \
/ k# [4 {* E1 n+ F' F. ]9 N+ n2.1 : DLang 查询数据# n% @8 u+ A' J* V3 Z6 G
/ H3 z+ r, e+ ?0 g+ _import std.stdio;
2 v. w/ D1 y: u% W
( i3 v( n/ j! ^) v" @ Y+ \4 Nimport hunt.database;3 @1 Z- I) {, o4 \" {9 p( G
S5 N% q% n$ f, |7 v* U
void main()
3 [+ V( k' o/ ^" |: Z& h g/ ^0 m
2 E3 h- {5 ~4 A+ P' b{
& H1 L. H$ i/ R+ U" T1 @; o ]/ J9 S( t
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
; A1 ~& K) ^' ~6 L9 \0 X) D" D2 Q, f" T1 ]- Z5 J( z0 C3 b! u
foreach(row; db.query("SELECT * FROM user LIMIT 10"))" J* g! ^: E' I* X- s
' ^! c6 z. L9 w3 G& \{3 X0 d( A8 {7 B, i9 b
- h8 }1 [- W6 n$ y* e C. g; b
writeln(row["username"]);3 _) }! c1 i: x3 l) Y8 @& O
+ X2 E0 e0 l$ t: V. p}
" O% K8 {/ P9 r. D7 W. H5 A
2 R: y2 c1 M& E2 ~' ^( e5 Ldb.close();
4 M: ^' b8 c# X
0 s6 P- M. z3 p# b2 m/ n}! `% \% n2 [6 H) u' H
N7 x a, J9 t7 \, Q5 V* B: U9 @! T2.2 : Rust 查询数据# q( H5 b; M1 v. ~7 [
6 X3 q, G0 x5 W/ S
extern crate postgres;9 H. B: I, j5 a* v6 C a
( P) y9 R% }* N$ e- m0 suse postgres::{Connection, SslMode};
8 c0 o! K$ g; H! t3 H4 q! [3 N8 I! U% h/ w! l
fn main() {
; E2 H' R, |: C% N5 b- w( W6 _& O: o4 y
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
' ~+ v5 u- u8 U+ p& \, u' a
8 T, n$ F9 \: F6 J! s6 ?. Rfor row in &conn.query("SELECT * FROM user", &[]).unwrap();$ n& U. f! J% v9 V! e$ u
5 a. Q! a9 d+ Q+ s/ v5 L( Uprintln!("Found person {}", row.get(0));
0 O8 U/ M* H: s2 N9 `( Z
; q% a3 w# v5 [: h8 ]& q3 g- J}
% M& L( D; w2 U x' l" g0 x, ` ~* I
}
% B* V) {8 _4 b) u7 n7 q) T
. v1 i7 Y' L7 I8 i* Z2 i2 l2.3 : Golang 查询数据, Y4 _) S7 j8 E3 W0 y! i
! ?& s: [+ Q5 g5 ]" \7 i# v/ yimport (. {4 @, E$ n% E4 [# ~/ f9 R
0 L" p3 }. ~9 n9 U* G"database/sql"
0 o4 a; }1 G8 L" g5 o0 U) h7 }3 B' L* l$ M3 W) ]
"fmt"
$ k% S& q0 j) S# _1 ~
+ b# L3 F. V+ J* E( G_ "github.com/lib/pq"
4 j$ n, \# ` n0 a1 B \
* L' ~7 T6 ~" i |/ I5 Q l"time"6 S4 R6 y! y7 |4 V# n# k; O
( Y& N1 x' S y8 k- j1 \- P& W
"log"
6 k. s4 Q- [2 z; O/ z( w2 T# n* F$ H
)! J) r5 T2 l8 B) b6 ]' j! p" [+ c) r
/ _8 v( i6 Y$ R0 q" m D" W; stype User struct {
) A+ r, V" K" \4 F& c& W& r F7 |3 F, v* Y7 L
UserName string
5 d _ ?8 r. U) f, V2 a" U9 y5 a2 p8 A' Q1 ~0 c
}
: F0 o' g# [ b
$ V. p6 s4 z3 a" z1 ^5 ufunc main() {
1 X* E$ q5 _ v5 H) G6 g' ?% P ^
- S0 t: M7 N1 Y. a1 Gdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
) c' H! |# }7 z$ f
4 ]. O. L% h! s" F7 E. n& ?if err != nil {, m* t; F& ^' d1 T
# W( x. N Z4 h9 h# v0 N
log.Fatal(err)
& M8 r- S* P+ {3 T! W# q+ z* F7 P, P) }) `: h4 J
return nil e$ i5 l& O0 U; O5 v3 h3 S
& Z' O6 q/ p {4 j
}) [' D3 W3 T- P% g9 a* \* \
5 p7 M- b% {+ c9 s% Huser := User{}
e% Z+ g5 V2 J. L
2 d: _% S$ u+ sstmt := db.Query("SELECT * FROM user")! g) q% x1 {5 b
' _' S" [7 P7 ^for rows.Next() {1 x; K( S+ l: g g0 o1 R
$ n, c' s9 g6 ?rows.Scan(&user.UserName)" Q( }! G9 W! u8 J+ I+ y
2 z# s4 j8 ^/ @: }fmt.Println(user.UserName)# D7 _: ^% c; s6 o( Z4 |
* z0 r" ?5 J ?& r% U( n
}9 ~) Y5 z. A. S7 w$ Z8 t
/ Y* I4 h# }$ Z% h8 i+ g: C7 kstmt.Close()
5 w- _7 r, Y; S1 W( H0 O
+ W& ]+ S; Y* e4 m+ Y3 Q. r& z* x}$ g" Q r! n/ V0 e6 L
, {8 C/ _( e. {; g3 l( k0 f三、总结
! r) _+ w/ ?5 k9 z) R& A
8 j6 m2 V x, U f0 o1 j- a- _/ i对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
4 y0 ~) g; X4 |. Z) J7 m+ y) d" V. E' e# e. C
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
+ u% W) _) @4 P2 G+ t: k2 a1 ~, B. ]9 _6 q+ w0 N* ?# t! P/ R
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
, Q& q( B) \3 B: m
: U' d- H. a# _9 ?总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。2 z9 D" |& w8 F$ n
————————————————. l* w2 y" r1 a2 P- r
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 o& C6 I% E+ l% Y$ w
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
* X& M) R/ O4 N) n& F
0 x, ]7 M4 r1 D$ \; q1 b |
|