管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
4 i$ g6 Z& t5 O1 `: p
. r1 E) X, Q, t5 U一、数据插入 - INSERT
5 p- s+ f5 d6 T. T: T3 ]% O% [& S6 o
1.1 : DLang 插入数据
5 e) \% \; |. b8 M& z) p
8 U/ c! G; e+ q6 F* Eimport std.stdio;( T+ k! W5 g( D0 S( T' ?
$ M) p) ~# B' W, L1 l, }
import hunt.database;
5 `% s# S' @, F9 d. B, g/ }" `: v, z; N! X L
void main()% _0 i) }; b: x3 m
5 Y( Q( Q5 M, m* J4 I1 R1 ~{* n8 b6 z2 ]1 _: l
3 s z. W- y8 k! h
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");/ H O X3 P8 I+ G( F1 T/ o
6 {. R. s1 w% X6 |! ^int result = db.execute(`INSERT INTO user(username) VALUES("test")`);! K& a5 O) x) H9 ~. \- n
! l# k: d7 z3 Y2 B# e& o" p6 ~, a" S
// 打印插入数量 B `, C+ Q3 ^5 ^4 \
( s' A1 Z( z7 ~8 \: T0 `writeln(result);
6 y. ?, o6 @5 D1 G' W2 I- J
3 n! p( D: ~1 w6 {db.close();; P' v- W1 k; Z5 j2 g. C! h5 F+ t
3 Y; W4 ^# W a+ ^0 a}
7 {$ h! w; t: U, K0 O9 e1 T o+ D ^8 i- r# i+ k
1.2 : Rust 插入数据" k( O3 p$ m1 A {2 y) ~! R
8 E1 j1 [7 r" g* Z0 c
extern crate postgres;
- {: b; q* }3 n* r' L4 p* {' V; K' {$ w
use postgres::{Connection, SslMode};
/ q, s( o0 F) Z& K1 ? D1 `) f6 c
1 G4 m2 c% W0 o8 z; _; mfn main() {
* H2 i2 l9 l1 k" T# e1 p- R( H
$ j3 f. i0 k8 A y" F6 d2 K( ?' p; Llet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();6 s) O4 }% \3 k+ |% N) x: i
0 }5 }* ^6 W9 l$ [3 Mconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap(); E7 x# m4 z( o1 {5 s# ~: n2 O+ U
/ F0 w* m* P8 _# D+ S; ?
}
2 N4 k- R9 x# p2 G. j( s5 Q. J1 H S" j
1.3 : Golang 插入数据 D+ N& w2 b9 M4 u
" b/ d; g u$ S5 o! @
import (
' o4 K ?4 [5 w0 o5 Y6 j6 ]+ l; }0 ^1 _9 D4 T- \0 @
"database/sql"/ U$ n2 \, ~6 ^9 f7 d7 f
( g' R% ?- }; s"fmt"5 C. S7 b" z: H
) ]* C( P) h0 H2 S! E8 v, d# l_ "github.com/lib/pq"5 I$ W5 h( \" w: g7 C
; R+ r6 N/ L4 J"time"
; u8 H4 S6 f+ g
- V2 N4 z! Q6 n2 N- j"log"
* h, }0 O S5 j8 r
- p* k" {% Q5 a3 ]1 J$ T; _) k)$ U5 h( j6 j2 X8 V
4 o# y* { e) t- c
func main() {
& B! V! A+ G$ g% m0 N- \' ~& z% T
( f/ N9 }( u# c2 \7 }db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
0 m ^% B: z2 s% K2 s0 E6 C& h W6 Q& F2 Z/ E/ S. F
if err != nil {
) B$ k( [/ g& T$ e! N7 _: l2 t1 z0 F5 D1 Y! R. m# n
log.Fatal(err), c, x- N- y0 w# @' j& G! m
m8 R1 P$ Q# ?& \0 S1 Hreturn nil$ U9 e, N1 Z) B% H0 M
# q @* z3 r, [
}+ k) V {* Z6 Y- v2 N
# a' d6 C# F/ ?8 \0 b% ]% ^- C
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
( {& x; \5 A8 b2 n$ h e0 C1 N% E* w; A# S
stmt.Exec()1 p" u$ n+ d" |8 u
; g6 z C; s: b+ U4 }; b. [* bstmt.Close()/ [* a: I; t& [$ w S4 C3 r! c
7 o: }. Y8 f* _1 A2 C4 t: V3 q
}; r- ~) v3 M( G8 B. y4 J; d3 K0 x' _
" L3 T( Q, o6 \, b
二、数据查询 - SELECT
: S: a4 q8 `3 ~; k- g. z, [( ~
0 z" I( g+ |# K2.1 : DLang 查询数据8 q0 }& R/ e: n3 d
$ C2 f, M$ L2 ]$ k) ^4 yimport std.stdio;
% G3 t5 e5 I& T E& ^+ \7 W3 B Y. E$ K
import hunt.database;, [: v& ?' s' G% q( N
: u; f R# o! `; ^( s. f
void main()% y1 T4 I9 u6 i1 o) ?, O1 ^
7 H5 ^4 X7 M) N& } Y
{8 }. [2 l- M" H$ d4 H
t* f3 G% I/ y! h2 H. e, i
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");( i0 k1 K' l2 P. |/ h
0 D# Z7 {5 {! zforeach(row; db.query("SELECT * FROM user LIMIT 10"))
+ n; v6 T. t4 x% F
$ q# e! D- q5 W5 V" X{
- Z& B2 A9 C- Y0 i* F
" x+ q) ?! Q* q" W9 `' e- c" o% kwriteln(row["username"]); O n) m; ?+ H
# }. }9 v3 E+ a2 f' _
}
. ?5 ?. J$ X% I m* g' C: _! W* R. a k( T s0 ]6 _
db.close();5 A! U0 _* O4 z
/ O/ i/ f: W$ l- c/ }1 z, H' N _
}# O' ?4 p8 ?' C* o8 A0 t7 s
, ]1 j8 @4 g5 V* A3 o" W N
2.2 : Rust 查询数据" D0 |0 l* ]* _) @+ ?4 [: H
% V% Q: T) `: v+ X+ Q, Bextern crate postgres;; C/ C+ ~0 v( Z$ J
, d4 H) J3 }! v' T+ d0 ]use postgres::{Connection, SslMode};
: B! {4 E/ |5 Y( f% i$ f4 X) e( t
( g4 t7 P* o% Y( u9 Sfn main() {* |0 u) ]% r/ c) |+ W. y; o% R
& Z1 v6 `4 [1 K% q6 O% o( V
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
/ }7 |, X$ t/ R" q: A: Q" D1 i/ u8 S5 k; }) p7 L: ?
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
$ q. T5 ~* {1 c' x% s0 C/ V, c7 b. W: T! M- t
println!("Found person {}", row.get(0));! w) T" y. I' d( T6 O. z0 a5 X
+ c9 O A) b/ m$ z" A `% Y5 \2 A}, E- n" @. a9 ]9 n
3 a& O5 d. F+ {; a}6 Z, C! M( j6 W; b4 O; ?
; a2 O3 R& L9 d" u
2.3 : Golang 查询数据
" g% ?: C4 _, V3 n) f# p/ r- `, T1 w N8 q! l7 Q+ w
import (
9 i. r: [ A3 ^& G; j3 u* Z
; D& O' n8 r5 K8 {8 t+ t"database/sql"' R6 w' } M6 ?, S. T
2 c! z: O' M0 j* T7 r"fmt"5 ^8 P) s1 w- C: ]
& p* k4 c2 I2 F5 S1 P* q0 B_ "github.com/lib/pq"
% P6 H$ m; b3 v6 u& R/ g& i- l6 I9 l* V9 j" L$ C8 |0 F
"time", p0 @: W2 `0 T' c# w
+ g+ U: W7 a2 V. v& i
"log"- g1 B' p. d# [ }) d, Q
4 e2 s) V S$ p
)3 |, O% `! l ?, ]
1 f" g [% ^. [! r! R2 F
type User struct {6 V; U$ j( a; t& s
$ Z$ Z; m$ C2 ^4 \% o1 b8 t m) }8 nUserName string
1 I* z$ H" k4 k$ s0 ^6 _( m: k
3 z( z8 i# e4 b/ m/ g}
$ C! U9 U) z q2 c& d8 B
+ G4 J( |& B7 J' b: |/ hfunc main() {! d& X" |: c ?& t
9 r' [* R# `' j1 `4 ]db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")) T& k. O. l: w$ o9 O. W8 Y
$ @ v+ \5 ` P) l
if err != nil {7 G" J% d' T) H2 C3 @1 i# y6 {/ @
+ X, Z& X& E# F6 k
log.Fatal(err)' P3 _( L3 Z) Y+ V# p( |( q
. N5 m$ A" y9 H4 Y+ Z6 \6 lreturn nil
" h# N; F9 g/ I7 F- P- O
( x5 n7 p) k: T" e/ J}
7 e8 m* o) j/ r+ A; A
: Y; c5 f$ C) S" G% b, V! Xuser := User{}
( E0 m7 A% K" @5 Q" W8 U" D3 |" v6 \8 u3 F" ^
stmt := db.Query("SELECT * FROM user")) h$ W( C& r! V$ Y1 @! N }" B. [
# \$ ?8 ~% u, q! I0 N, p
for rows.Next() {' i: f( [ f- [
+ F/ e5 |1 Q, F3 c
rows.Scan(&user.UserName)
; R8 y/ T; r6 O9 h' d7 q# P# D- Q* u3 p
fmt.Println(user.UserName)
: l, a8 V _1 ] _& E
6 R6 | e# D) k% I3 O+ J7 j/ t# e}
1 W7 C1 e* ^3 H3 Z" B1 F
" Q* A3 q0 U; fstmt.Close()
+ y- t# w3 x# E" p, f# X# A; B
( m/ T2 S5 q, x2 ~( s# e}
2 _2 n. j W" f. w2 W9 D7 Q7 O7 }0 z# z6 \; X5 F3 E2 a4 o
三、总结
! z4 A8 r# x% [2 y' i' y* p5 [3 p4 @6 @: J: P( [$ Z9 n# m8 z. A# O
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
$ o( ]4 ~" `3 x, w4 O5 T8 i8 ^5 [ _' e7 f* J9 z
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)( D% ?' y( D. ]" d! }4 q- ~8 D
; c9 u3 y8 I5 u' k' S) Y
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。; X6 O) l }; J q7 Q% {' h
: u. Y( }' f/ G6 x7 s( F总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
9 {: L0 w8 l; h& P————————————————( T" h8 d# @/ g: }! `
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- h ^! q! A6 O1 E
原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339613 t4 \$ a8 l2 C4 r6 t2 N+ o% j
" |4 ^) g6 m$ q( E- \
|
|