管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
i* W6 F: d6 e5 L& ^- m: M
? i/ e* V% o( L0 c. v: S Y& v一、数据插入 - INSERT/ I6 [/ M; M& }, q- ~& R
2 f g+ ?( t( u. r: ~0 X
1.1 : DLang 插入数据
2 E" J1 g, T5 F
4 t1 F: b6 M$ Q4 X& gimport std.stdio;
+ n# n* g! W ?; m& L% e* q, o
% A% J4 y% q+ `8 D+ Dimport hunt.database;
% U X( P: e0 v2 U5 }. E# I' Y7 \- }1 f0 H* p* T
void main()
: l6 C2 o9 w: m- _) N$ E
! o. l2 j" o1 f5 m% ^. R{: ~1 F$ T Y$ F' k+ c, G# m% j
" Q% B& t, w3 Y. |1 y
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");! u2 M/ D! ~) I1 E- n" V$ K; k# C
" ]( t, m, S: b9 I3 }! o. h
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);% S# E& z* e" _6 e" D+ H
& A4 c# ?) ~% w$ ]/ i0 f// 打印插入数量
6 o" R, J2 M) P' W1 _& W; {4 P- X7 i c8 {7 H
writeln(result); ?. O2 O, x& w9 |" Z+ e
) m0 E7 M7 @1 d) h
db.close();: h+ \$ p+ T: ^- u+ A5 @, b
$ J# m, P+ O. M/ w}( s, Z3 W* M7 q+ k; V& D
5 f9 C U; H0 ^$ |& F1.2 : Rust 插入数据6 S$ p+ ?& P. Q
% |) P) O7 {8 \) k% z1 d
extern crate postgres;
! \) o$ m9 W+ c7 l' w0 g \( n# d9 d1 w) D$ o: c
use postgres::{Connection, SslMode};) i! |4 x" S; M2 m$ X
" `9 ?* [: J( Afn main() {7 }+ E( Y; g% V
0 o" G) l. Z: I$ {let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
& k; z; i, r6 h0 Y5 Z5 W1 `
+ R- J! J% p* e( E( b& r: W' p; econn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
3 X+ S. t l; X- \0 f& P+ y4 M( o+ O. ]. [6 ]- \
}6 e9 d+ P2 r7 z& k8 k, ^
% S8 N- G0 g5 r* n5 U4 c
1.3 : Golang 插入数据
5 s5 f; ^, z! P" ~- ?8 w1 v! s j; R2 p9 W
import (8 q; V/ T4 m! V0 I
! R- r5 r3 s$ k- z$ d
"database/sql"
+ m; x. C+ G3 ]: e. n2 D+ a
2 [- _+ j0 q9 ~+ z N3 s"fmt", I7 j; o! K8 J: j+ D" H
3 E0 o/ z- }/ n5 P+ m
_ "github.com/lib/pq"
$ j; @* p+ q0 X) I. v' p
/ C% R2 g, a/ S; l"time"& m: L3 I- |/ w
3 W9 o: ?1 o3 x& u3 A7 ^6 M- e; e
"log"
- k8 ~6 s* B# d4 Q% Y
) e; K; \* p. Q8 p1 {1 I) c1 Y4 s)
* |" C0 i$ w; u6 F! Z9 E# {0 [2 r# j
* l" b2 Y* n4 c8 Bfunc main() {
# z5 ]+ o6 u+ h0 B* X! \& j. C# D K- {% O& n0 K# }) @ [
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
& r" p$ w& | k% X/ C
2 t, @; q. I4 x/ y7 o. pif err != nil {: o/ }0 @- b: r l3 R
; I" s3 T. r* F7 h1 O% [; hlog.Fatal(err)1 j. e1 C+ I+ D4 b
; Z Z7 l) z: H( |* u F/ K8 t( mreturn nil
, C8 b( b8 f$ \2 E, Q# f9 C; C4 {& T3 o( {: k( D6 |
}/ u1 v W3 [* ?
% I: q& B; t) ]2 o" L9 f7 i) c( |) E1 |
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
! `! r7 G2 z( D1 ?# R* ]7 M% I! g ~1 }: g
stmt.Exec()
; S L- `5 U; R. W4 u. D) R$ Q p# c
stmt.Close()% i/ C5 t& ~5 R8 f* i9 i* m
; a/ N% R0 `6 D+ N}1 U3 ^+ q% R; h1 V
9 E' I- u7 k% Q+ O
二、数据查询 - SELECT/ l+ }9 D- C4 S) {4 \& h# x$ @1 j
9 K; V4 c( k) {: s; H2.1 : DLang 查询数据/ \- r) E$ j8 }( ], X3 j
5 s4 L1 i3 v, O g+ D
import std.stdio;
4 b9 k. u W5 l
0 q L, |6 {' b# O7 t/ fimport hunt.database;7 Q3 S X' l7 V0 R
B" V q: T4 w9 `8 ?* f: Svoid main()% o4 K ]% U* t/ C3 s
9 r1 ]& H6 }+ Y{
7 `* R( \ t4 d. E( a# a
) k) ~ l+ z& L" a1 h5 ]& s: Cauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
7 L' `8 n& n- Z: a" ?: s H3 ~: ^/ F! \
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
2 x* P& B6 K1 z1 _0 b) o* M$ {. F
1 I& w1 s& W* P2 l, \3 D{
" h0 Q1 _* @; m% A$ E3 p7 ?' r% f
writeln(row["username"]);
/ U# U* Z5 l9 ]' f# U0 M" {7 g6 t
}* H! l) c2 b9 j6 j' H
* S& G0 r7 a- Y* }db.close();) T7 m0 Q; U+ o. q% c) ]9 l
0 b" |& t4 K) L; e
}% y- _5 w: X- A1 w4 d& h
+ t. f2 R1 }! _2.2 : Rust 查询数据3 T2 ]. C; ^ I- O
3 H- _! m% a0 X2 g& w
extern crate postgres;
/ y) r9 F; Y# J, P% z. k1 s' A( x& m* c7 H+ O( h
use postgres::{Connection, SslMode}; c+ ]4 R% s8 W3 G# G1 f
! E% f t) m1 h- K1 P: |fn main() {, H1 x7 a. y5 i c+ l
( @) U. c2 J6 u8 H% P3 n
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
; ~8 Y; G8 Z8 g. I! M7 O8 K( p$ o' o* ~: V. H, v1 `0 ]
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
% z7 w! b h# ^; M% d$ i5 I( Y9 n L: v. M( `& C3 e, J
println!("Found person {}", row.get(0));& I1 P, N. R! y+ }* ~: b" j" e
9 h! F1 M5 N: g/ r0 L4 P
}+ @# @$ Z2 J9 R1 {) b
; X o1 o4 D: i" ^
}7 A. ^& i @: }- o
) X, t3 o/ O ` x! j
2.3 : Golang 查询数据- ~; ?- t- T& [) I+ Y: _; D1 s
- K- u/ D. @# U" i, S* r; Oimport (
0 J9 e; L1 I" K3 g$ E8 O0 Y
3 w# `+ [- c; n3 K/ W2 W1 \4 s9 U"database/sql"
. G# j' [: H1 V( S# [6 q( _4 K4 R) U' ?4 X2 A9 `& ]
"fmt"3 p8 _7 n6 v. g% Z9 a
" P1 X+ D5 D9 [2 o9 |4 ?& t_ "github.com/lib/pq"+ }! g- _) A2 U$ I% W/ G
: E* I M$ c4 f/ E5 H, z"time"
4 J3 s& \! y/ l: b
, s$ B, W7 z, s# ?"log"
# ?% ^% w; V8 k
& X* ^( Z/ u+ I4 W); o* e F4 e, W& o4 l+ ^' h
! ?* h8 f( n" J: U0 G3 d8 L
type User struct {
0 L( A$ `/ ?7 J4 |+ x: R8 T6 y
3 A; |9 b; ^3 l6 s* Y! yUserName string
, v. X3 z U% ]9 R9 r" \, c* @# x1 T q1 k
}
' m/ D/ |) q% X- Q6 H
4 g7 f1 w7 _3 Zfunc main() {
$ I% a$ ?' r. c& _. w4 d o8 n& j: x t* \# u* W5 h
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
. `; p4 [1 m3 P) _+ h* z4 i6 Y# i. ]' K$ B, b
if err != nil {7 `( n; f+ E+ g* S+ ]
! g" ?8 }: a1 f* @: S+ d$ \log.Fatal(err)
% O j$ P; |5 j5 H5 f, I
0 N& Z% [$ b( ^$ u3 G, areturn nil* \. N' M% y; V- k v( |* ?
5 Q! b: X. d8 Q4 ~ p. X}6 g; I% T: d" {9 A0 \
: ~+ @/ g8 ]8 F" N6 w
user := User{}) t- Z, P$ ?" O: V$ T3 v# L1 @
# d: L" t1 M; ?4 f& l+ f
stmt := db.Query("SELECT * FROM user"). j0 V4 I5 ]% V% g b/ Y
& l% Y1 S- w) [for rows.Next() {
1 B% M0 D) E9 U3 j/ w/ x( N' S6 t7 m8 v* W {/ f5 b
rows.Scan(&user.UserName)* U, Y7 Y2 _" F' p2 k! p! n- s: ^
$ P: M3 l" F# e6 [# G+ O1 ~7 k
fmt.Println(user.UserName)
$ t' {. m$ ~8 w5 E F4 Z# d! N
! \/ Z. X( v& ^) {4 l}* m" a& s/ l& Q, v3 t8 X# z
6 L1 O8 ^6 U# l5 _* l9 P" Z3 C
stmt.Close()
4 r" d. |0 _3 q/ j- \2 c9 D1 b9 R: d( W5 c
}
+ E: }5 r3 L+ K' H6 t0 C# w+ H( I! c
三、总结, E( F- E' m& Q1 v" I; O
% M8 [1 m9 x" q2 j9 n
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
% R) N" P5 d4 f" v: c
, n+ |8 S8 G" \9 A7 _这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
5 G, \7 j! ?4 F1 M7 L- H* I" c$ v0 z0 X/ C6 M8 g& @" F+ i
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。/ u6 h2 a6 x& E0 l& F$ f1 @
f w& @0 y# W
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
! ~: b! i3 l2 U8 }) h; q5 @————————————————6 F; U& V) I! F4 [4 V. ?. C
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- D8 R, f. d; V, r8 k# m
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
; Q! Y9 N$ D& p' ]& G3 ~% e7 g. q; q" O. \7 W- ~
|
|