管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
$ F* R5 B& \& _( h- I* g4 y
7 P6 p' \+ h6 A9 K8 b9 a6 c一、数据插入 - INSERT
$ u$ c+ I3 O( H" M) C$ [
" [+ t- h9 Q6 H2 L, D. i) V1.1 : DLang 插入数据1 E# _+ I. i1 n, @& P4 ^8 F2 q
2 R: m' @" L( dimport std.stdio;
- h, z$ p3 x) Z! C- U6 ^/ @5 a; `3 _3 n0 d/ j( v: H; q' g
import hunt.database;: g, \5 ^; T/ ~' m0 J8 ~
# ~! X3 r. ]1 F: f7 d
void main()
0 o( T9 D5 J3 U, [4 c1 ]# E0 e p% F( C$ ~( [3 n/ f9 O
{& a( H }2 w) Y( }
; Z- ~4 n% w" w; d1 ]2 Z# `7 U4 g! ]auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");3 s% m* K. K0 H/ s
( N3 Q# D; x% }% V
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
* m, I! P8 G9 W4 X; L8 b% x/ h
6 w/ Q; x2 M6 S8 M// 打印插入数量
6 D6 ` F9 _% w) D- ~2 c
( {' U2 F0 Q2 g: rwriteln(result);* b0 Y* n" p$ s9 Q; z
0 I! J* F- W1 V% t0 f; g8 n# adb.close();
# g i+ e0 N% J$ ]
1 U; b, j& ]. z' [}
: D- p4 y7 f2 S% p3 A7 Y6 h; c: a" s5 |- a, ]8 J) Y% q
1.2 : Rust 插入数据
T! p3 l: M; l- j$ `4 q" \6 F' j0 j7 u# v$ ]" ^& f
extern crate postgres; }5 m/ n) Y. I" i+ ?
2 K+ N9 C1 h# A+ L- I
use postgres::{Connection, SslMode};2 p) ?% H b- G
5 ^! [8 I0 v* L; c# vfn main() {
( S& k% ~, \; v$ l5 E; W3 N6 o6 T
1 R- D; L h- ~: B, Hlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ x6 a5 ?9 g4 F" y
& ^8 S0 e+ X6 G! @conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();5 e" H, S9 E% W/ F
5 N; L, Y1 S) Q. I8 k# T}
2 ]: f1 [, j- u4 d1 T$ Z1 H& t3 L- e$ n! n% u
1.3 : Golang 插入数据) z2 }1 H' p3 y
1 m7 w3 r v) Y
import (+ o9 t7 s! r3 x$ }0 S: ]
! h3 T) p6 y. n* z
"database/sql"
* m: O- e0 K7 R3 ]4 i! B9 F; h7 E. ?* A9 i! w
"fmt". q5 E/ P* g* u; f
9 [$ ~2 {# J+ ~( H: v_ "github.com/lib/pq"
# n+ Z$ |' o% ~0 T' N: i2 Y# _- T% `7 B7 X0 Q
"time"
9 G2 X3 j1 O5 J' u0 A" o
. i5 Q3 B; ~& N8 w"log"9 L2 H3 ]" @0 e$ U6 D _
q3 C# N o& `, F9 q" e2 r! H
)
( T+ S8 q) F' R* z( @8 m
9 C/ K1 q3 S1 o& x- s* Jfunc main() {" d5 C9 T6 l/ Z* w
2 X, t: S8 P8 k, t J
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
7 _9 |* n# K& }/ }+ j0 Q" w; h7 e' f0 z! `* m
if err != nil {
" p# v$ ~3 r$ _6 K' H6 z$ W
, X- i& {/ K, } i2 tlog.Fatal(err)0 [; G1 @$ M" o v- c
0 r: k; c- b0 J$ v9 N5 L7 @; @return nil% b; u+ M% u# w
9 Q/ N& c. R; X% o& R; {; S% E' X}
7 H& f/ R7 {( s$ @/ e j# O T' t# ~8 L s" E o+ j
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
6 n2 ~' a7 J$ ]! b
f& [/ V1 ^* M+ J A' _, r5 fstmt.Exec()
( r1 X% U2 }* V% [; |1 k$ V4 G2 E7 h' Q
stmt.Close()
- Y& O6 e; x3 q) b+ J, e
" j+ t+ S8 J7 k V( {% `}# f S7 ]+ A7 c' P
" R* b! s7 Y* j6 y6 ]
二、数据查询 - SELECT
$ J( c9 C' y3 M) k1 C1 k, O3 q# \# u# y V
2.1 : DLang 查询数据; g8 Y2 W5 _3 C* D3 P% G
* h( t( G$ d% l, o7 m
import std.stdio;
( u( e" h. G) ~( }
( O( n0 q: {* @$ A$ F0 Zimport hunt.database;" ]- M9 H; V, i9 n B2 L E" g% }
5 G U( x& P6 X7 ]4 Q
void main()
M4 p- H! j" A: C- F; f
' A1 ]6 {% p( L) [) {: g) S u2 `{, z k/ ^$ Z: }8 x
0 r$ Q& l. S6 L( i7 r9 d% E
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");/ Y# \7 j& c+ a4 d
0 _' `# G8 v* [' ]9 c
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
, f* o C+ e' n# t3 U! Q2 c6 }: F+ G
: a/ ?0 @3 p R$ a& D8 f2 K# q{- ?' h& v+ v* ]- J4 Y! R$ d' y
/ [( ~) h% k/ E2 }" B( B. h1 A% cwriteln(row["username"]);
& n b: c+ ?5 p% l2 E* S
B8 m* O9 T7 k( f* s$ p1 B}
, D0 r8 x$ j5 G6 W% a
T% `$ P- v: e- i- ndb.close();/ r6 P8 x1 Q6 w* m! I* U
' A! ]7 z, ]' c6 w
}4 N$ W9 A( f- ]
9 X' r; D( }' f1 U% {
2.2 : Rust 查询数据
( Y3 B" S: h) {: j) v5 j
2 E2 {' G1 m' ~7 qextern crate postgres;! K2 c6 F t3 V, M5 ?
+ y5 o5 v( l4 v" g0 q' p8 `use postgres::{Connection, SslMode};+ [8 N$ a. ~8 R# s* C% z- k" b
* Q5 B' U9 R. S# {. R8 vfn main() {' R* K% c) }. Q' \ o$ R8 q q
5 e- n# _) m) w- k, f& T5 _let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();3 h5 a; V; \( i& v# O+ b0 s
. u( l. i( T0 e3 G K) a" V2 Ifor row in &conn.query("SELECT * FROM user", &[]).unwrap();
* I0 {$ N/ r$ \9 z0 r7 W1 `# r Q: _0 m3 }3 l8 S: x' B: f1 S) {+ x
println!("Found person {}", row.get(0));
/ j5 o! [* y2 W, j$ F6 V) J9 y# X+ E2 c1 r! l/ t
}( U/ |, _, ^4 s1 P' Q+ @9 V
?9 k& ~1 F+ C7 P
}& U/ t7 ~8 R b2 P2 {$ G
0 A Y2 c4 I2 r$ S; @. P& ?
2.3 : Golang 查询数据
; B \1 c8 l3 T7 W& L+ f/ I6 x. }/ v, s @, \$ V7 N
import (7 b3 Y" s _3 L% b$ E6 m' ~
1 b+ q u; |; c, k8 |5 S5 R3 S"database/sql"" e+ O2 I+ _1 R
0 g$ Y2 R) c, J: Y; n4 p: F; K% q
"fmt"2 {( w$ }9 [7 e( G( [& Q
r V7 Q( P4 h& d" X5 ~+ z_ "github.com/lib/pq"
4 ?% t8 {; a6 T( Q+ _+ I# W4 d/ J; f8 B# D# Q: ^$ q M& V: F
"time"& @* }# n% w2 r9 ~) W$ u
& U$ |7 Q- L7 r"log"
& S" e! Y1 N4 ?& Y% t1 G, f3 }* ^0 o- @' N* R
)
8 o6 l8 Z2 G) b- g6 ~$ a5 O
/ r% Y q7 D; ~6 t' |$ L8 F( a, X Vtype User struct {
' y$ r8 n+ m3 d+ I
# v4 p/ _9 g0 C" S" ?' Q1 cUserName string
! u' L; a. c& t! y+ t# c2 E/ Q3 \4 Z. {9 u$ L' I: x1 Z, u1 h- r
}7 r+ x+ p. B9 m9 s; S$ M
! w; @% \, E0 a1 \4 t4 |4 `func main() {0 F$ ?: a0 `9 w9 F# o5 e2 r+ y4 a
5 [/ T' g, p. m& p
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
) F% }8 _0 w3 ^& M3 n7 M0 D; Y" }/ _6 e: T- m. K! R) S. H
if err != nil {
& g0 e4 j1 l# j; t6 G W6 T Q9 x# g+ B; r
log.Fatal(err)
( v x+ Q# g* h- c; W5 x Z, e$ B. u
return nil
% j% S" @9 Z2 s
. q! H) @1 _9 T: {}( w- o% o0 g7 N' `6 M4 a( }
* G/ Q2 _& b) G% {
user := User{}
- p. o. J2 Q- \5 j7 d- S+ \1 C" f+ A# [5 w
stmt := db.Query("SELECT * FROM user")
( j- Y. h, a% v& |* M- D4 D/ _* V4 @/ ~) {5 f. X2 r
for rows.Next() {
( M9 Z: z! g& `$ S7 G% d2 ?" q- x
% T5 K" h5 H- ^' \' N6 @1 ~, _. jrows.Scan(&user.UserName). H: ~5 K/ V7 S( p, m. u6 o( Z
* J z6 d3 Q8 }% K w7 T# O& C% w4 u
fmt.Println(user.UserName)
/ L. z& {# C6 O7 M& F* H9 _% w& f" k% Q6 Q$ A" I6 v
}* N% i* v% N# a+ e, C
+ Q- P$ U; k& V
stmt.Close()* J# X" D2 ^ _+ b% Z3 {
W% L0 c* |8 f, h1 k9 Y/ o T
}
" D3 ]8 ~8 m/ z( A: `3 {' H8 p2 Z% H
, o; J" Z* }; E+ @三、总结! U" i$ u# T- I0 q+ }
! \( G9 z3 @ l/ V. V9 Z
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。) O9 G; ?% O5 |0 }$ |1 y
/ j( _; f+ ^; h- M, t这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
~$ D+ o, H$ Q: R5 [( d! ?2 p U1 Q' j) G
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。0 J2 z3 L6 Q+ Z! K. f. C' I7 ]
, {) C, d$ [& V/ k) @总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。9 `: U# H, X3 Q4 c, a) q
————————————————7 C5 d. R5 C4 h
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 F* `0 q9 k% J1 l2 @2 d) k原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
# p/ c: q0 V3 C
: I1 t% @9 b5 D0 o3 P1 S, Y |
|