管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
& i3 }/ l' ?! D" W5 y7 J, B/ Y
: g# ~. |3 r! j7 I) z$ r一、数据插入 - INSERT
) H; Y2 {9 M+ {% D; _) b
- @$ w% l+ P4 D1.1 : DLang 插入数据
& W. p* S7 J4 O3 U; ]4 m" K6 R5 z0 n2 i, T
import std.stdio;
6 l. ~1 q; N2 k$ w
$ W3 ~& o& U) a, l- U2 K Kimport hunt.database;
2 Z" L! g; F* v; b) s$ ?- K N/ H4 b: i* f! f
void main()
. T0 ?0 `9 L( _0 E: h# f0 c1 b
9 a) B0 h3 ?8 l- J{0 e# D% S; b( V: X" y
x( d- f* V% P) b" I5 t
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");) }# U6 O2 \: x) ^, F1 v
9 z3 n4 w. p" j2 `8 \! [int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
% e/ q; x7 A8 I" g
. M) l ~- d; S// 打印插入数量
3 l& z. j$ k/ m. z* @( t0 ~
0 {/ W9 I, c& G1 i4 A) }writeln(result);' K, q: [* H5 s1 P0 j- K' j
% h8 o& z- I* x( q5 gdb.close();# F* \. A* y$ w8 G1 o- n
1 G4 j+ C1 V0 X( a) f}+ K9 D6 }' n" t3 I) |! ]
$ K! X5 K4 Q2 j3 J# e; R
1.2 : Rust 插入数据: o3 n* i1 N& r4 U4 H
/ x4 z: A' R- U8 a ~- pextern crate postgres;
# ^8 I" m! O9 f" Z4 f* a% ~
3 R5 P; \: l. I# v, zuse postgres::{Connection, SslMode};' b2 ^: |8 x3 i5 F! a4 b1 R1 i: |
% t9 |' L" e J
fn main() {4 \9 j* O4 T8 D* y7 @" J/ X
7 E. W, ~ Q& W2 w- V$ i Slet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();- g$ ~ U; m+ H' r* V
* M+ Y$ ]5 h* H3 p. J5 a% W( S
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
' g j: m+ q7 V2 [3 D$ s3 H& T, t, ]6 H
}2 }: T; l4 x; \4 l7 W
/ o8 N7 @! ]* m7 ?) U; v
1.3 : Golang 插入数据
! Z$ V3 H# @/ e( K
: ~. q! b# e6 |3 F6 \import (
9 H& N E7 c* o8 u4 o6 Y
; s* Y0 `6 @; z, R( F1 J% g"database/sql". N# {" ^' E j- p# p3 k. D
6 U% W3 x5 f7 H. H"fmt"
3 A% L9 P3 h( I; \2 A4 a) n' { l1 z t T% h! v( `; Q! H, k7 \' i
_ "github.com/lib/pq"
8 y& s# W. c5 K: D
m5 r9 x# Q- J3 y6 T"time"
`3 M' {, t# ]0 l6 i
7 i! g5 J6 v2 @1 y! p7 z"log"7 `7 `3 L/ I4 D5 `
% B: w- C6 J* l0 W- @: l
)
9 ]- ^7 u1 k: N5 V
6 ]# t- h* r) }+ s Dfunc main() {
# _: j$ w, R8 m) M4 A; @: i. x0 v" l& x' N$ p% Y, h
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"); W. W8 j5 n# }4 N" Z
, T1 `! M: `' N
if err != nil {+ R& v- D3 Y6 B$ i; g; G" s. T
1 Y0 J9 k1 y! k
log.Fatal(err)2 h; Q7 O2 S4 R& ^ \: X
# e' p0 M' Q! H& s# Zreturn nil
' j! y: \/ m3 L1 g, S9 i
) [2 m0 H+ Q4 c1 L8 r7 ^/ |$ W}
( w8 v; i3 ?! f" j
1 A* O, v3 ~% A" a t( h- v( Hstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")* A8 F5 \' n( e' `& P- J
3 b1 X. S6 M% t0 L2 a! ]: g) w
stmt.Exec()
/ M# q" t1 z' X7 \. c
, t+ n: v2 |3 l% u, ~& P2 sstmt.Close()6 V+ C$ z3 v& d
2 ^/ t5 P7 K! Y% o d/ ^* x. k, s8 V
}
( ]. [; u, M( b
* B1 P3 c+ G. U3 v+ L二、数据查询 - SELECT% a+ s* V6 P: U* V8 V
: Z5 G* F' @% [2 ]2.1 : DLang 查询数据
6 I& I, w( {( v/ w& W5 C. Q1 _2 A! K% X: w8 k) [* @5 N
import std.stdio;
# n% N0 P4 C9 c. X9 o8 r8 c; t
9 e. w- a$ O [, s6 Mimport hunt.database;
" X; i1 o: l( N, I7 X b4 s' n6 ?) E- ~" R# ?0 O# v# V+ \, S
void main()8 C' d3 ~) u) k, L$ x# l* S
8 a: ]/ S( \$ Z7 l- E' }9 E: W{
* D$ _* ^6 {( f
8 ^9 M. X+ H. W7 rauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
5 Y' a8 V/ b. q# P! W. x0 \9 [1 ?! [! \: }; b U
foreach(row; db.query("SELECT * FROM user LIMIT 10")): w0 f4 @3 H/ ~8 L8 A. Z: g
% z" e6 n0 V- @' s' X{
7 l7 d+ F1 N- `: Z+ {7 o* k' ~
( j9 u3 e" B% Swriteln(row["username"]);
5 v+ b5 n5 n3 y
# P2 w3 a8 \5 m. W( w9 Z}
; a1 V/ h" ?; T5 H1 `
+ h8 e/ u, w2 y+ b- E3 ]db.close();9 D; `7 Q. e; W2 X5 l
* n6 Z1 l* H) M+ D: L9 r# _* v}
: o4 u7 _8 p/ {( u- G S
! d9 S) a8 x) m2 V2.2 : Rust 查询数据5 Q7 V* Z3 @! x
) {5 T8 v4 r n8 i
extern crate postgres;
! A' F$ S. P5 N7 u/ ~+ G7 k7 w
' {, z6 R2 Q# ], ?1 quse postgres::{Connection, SslMode};
# P) ?0 C2 T6 F
1 k0 f; m2 U3 c6 I' I. cfn main() {
" E8 @: n: j3 n2 D, ]1 q
4 S7 l: @- O9 {" alet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();+ ^& l& J _( c- S; f# r5 ]
# c# }" g8 H( |; tfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
! I9 g3 J' E2 D
; j) [4 U0 k+ t9 d( H4 oprintln!("Found person {}", row.get(0));
0 B: g7 [ T& O7 ]
r1 n H! U2 p b9 ?}0 T& {- c4 P7 H7 N$ F; S* j
, k9 _7 I0 W! o# r# p, e( J}9 m& d& A- y" M8 e
: K; @8 a9 O; \2.3 : Golang 查询数据+ z- ?0 z5 J# g: a' S/ ^
( t, L3 A: {' j7 M
import (
- A- L( d, c' {% K8 R/ P- b Q/ R/ i+ Y4 G! O3 H
"database/sql"
) e2 i2 k5 f9 U+ W( b
: A. C" ^' H5 U3 v n; m6 x"fmt"$ I1 h$ [/ x7 E) {( W4 V
u- I( ~6 c* m
_ "github.com/lib/pq", _) u( U" q, A' Z" W& A
, m+ @% T* R. d6 Q; M' A, j2 V
"time"$ V' O1 d- Z7 K5 u0 U
3 \ M3 K( ?& `# K+ j) N"log"
% w, Q* E5 u; H' |) w$ y
7 ~% _0 I$ X* _; z; g)' ^8 `' v; M% L ~# L
# d! g) Q2 c2 ytype User struct {" j) M* k3 U. M! D( l
\$ G$ p f) N! d8 U3 J
UserName string' y' u7 b- N7 q. F
Y( i5 m# C# ]
}
' z3 n9 N( x# E4 K: }+ S
' c7 E2 R$ N0 \func main() {
% ?! V/ S! {8 \, _) ~) _
5 L1 J K' m5 j& p% C+ m Hdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
- W( V0 K6 ^9 T/ ]3 Z# c6 P4 W' k" s3 w2 {5 o8 c" K( R
if err != nil {+ |+ c4 l! v: r# l) U
* W4 _) r @' O' Q" D$ plog.Fatal(err)9 ~$ s5 W$ }3 [
3 Q `' N" X8 \1 qreturn nil
5 k0 Y+ ?2 U$ k4 L* J% q/ R7 B. M4 T- k( y8 e7 L6 X) K8 e
}- v. ]5 h/ m' B* H/ I( D! D/ B
% `1 v: Z/ }/ R% K3 n& Ruser := User{}" C# q3 s7 A( Q% y
: F4 M& _3 r% T$ J/ D2 Kstmt := db.Query("SELECT * FROM user")5 X$ S) N, e& F R
* n& ~+ o' @, w% A9 ~7 X
for rows.Next() {" Q" K) |- f ?- r Z2 b
7 V8 u' c6 ~' `6 j/ mrows.Scan(&user.UserName)
$ M+ m& r( }2 S% K7 ~2 u# x
- j8 y' A2 s( x* X2 cfmt.Println(user.UserName)
& X+ `2 { V( g1 x# l K& `9 A7 ]; r& A9 h5 o5 o
}
5 j# I. Y8 A/ G Y! L- i4 J: Y" ]
stmt.Close()
, F, V! @- P2 J& U; f6 G5 Y
9 @: H1 t! R0 M# ?. y0 \- I. t}: o7 i; a, G7 k1 s
( v/ s- j4 ?. W6 A
三、总结
% h2 A7 \: n3 P% M+ q& `/ D8 B
. @4 T% T+ L# A7 I M! r对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。6 W5 X+ {5 d) U$ @6 s6 l/ G
5 v+ y, E, b/ U( _. `' u
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)/ q/ y e# ~. q+ _6 G( s: V
) k5 t8 Z1 Q# I2 S9 c+ V, I
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。! R3 {/ \/ _4 h* n: _) F
% K2 L. S0 R" l: p. L
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。8 n2 A$ a& p# D9 \' c
————————————————
. ]& ]& [+ A0 L: }' L/ w版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ a+ v; f& g+ m: }( o. q5 k
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961& K! a: P/ s2 m
, F- _8 i( X8 K' @8 N+ z! s
|
|