管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
4 N' L# [. m# F7 s7 |& O- m4 g( @! p, K: c- {' ~& Q& y
一、数据插入 - INSERT. |/ G7 @' o# d2 i
: X9 D5 Z. d2 O+ k1 N+ ~+ S1.1 : DLang 插入数据
4 _3 Y' y+ q" M/ v- L6 o! U
( J' m, Q) R8 Q. k" p; nimport std.stdio;
) J# K# T1 e6 O/ e, Q. R1 M
* b1 |4 H: I; L q( O% G: @import hunt.database;
2 |+ l+ p' U" d! w9 ^% [2 ~
8 G- h" j9 ~9 E3 d1 A3 Bvoid main()1 K8 p$ ]5 E- h% O: O& @
" G/ R: X5 g: Y# L# n+ m, }5 J{, U5 T0 @2 m2 M
2 m8 M C* K; C: W6 uauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");0 N' q5 L" N1 }
5 r6 i* G; b' yint result = db.execute(`INSERT INTO user(username) VALUES("test")`);$ u1 t! o0 W- i: x) d3 w
2 b. w( |# E( e/ G0 j" O/ W2 `
// 打印插入数量2 V( y, |. N V
9 t) a$ `: m/ P. n' J
writeln(result);4 G) w6 `7 O) b! K7 k* {
( P- }! [8 n: U! b: x, _3 [db.close();
# r/ `& W7 m0 B0 i1 A* B, r% H0 V; {% O |7 }% d9 w
}
/ e# g, M+ G1 M1 q8 r- f
; ]% L7 A1 Z, m* C9 a, j+ d" @1.2 : Rust 插入数据5 r0 v6 J% Q& J0 m
+ ~! T5 n6 p( T5 _3 P
extern crate postgres;" e3 v2 O6 |3 n* |8 U' o+ x& ]
* Y; h. ] k' E6 _ T+ x6 u
use postgres::{Connection, SslMode};6 P3 w4 V9 G$ {* U( y/ f
' P; i1 C' e, _& V; \' m6 l7 W
fn main() {( R# ?/ g$ U5 u% K
/ F" |- ~% D( {" b$ Clet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
3 H1 S5 F$ X9 n
" ]: d) f7 `7 Hconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
6 ^% h# ?6 s/ S8 _4 L# {5 ?! K& T: A
}& _ h/ [5 w3 k8 h& ]# p
. T- M5 }0 q6 Y
1.3 : Golang 插入数据) Y2 n: I# z% Z1 D% N
6 Z6 y2 W* A+ J |9 Y$ v
import (7 M2 Y" i( A d7 o( ^8 s6 N
( R/ W' T% ~3 K4 e
"database/sql"
% Y( \/ `* f& H- z
& Q4 `2 z( r8 v/ v& h"fmt". d) v4 `% B: H0 }+ D9 O
% E" p& O3 I! i0 Z/ M& ^/ M_ "github.com/lib/pq"
g: V3 Z8 U6 K% U2 o8 k, ~6 C* A! |" o Z* h1 Q' |" F4 c3 B' D
"time"* q0 l: Z2 z; L! |& U7 e0 l
3 I7 a1 L5 D: @6 x& o3 m0 ]"log"
5 z1 a* Q! V6 l% h: t
% ]$ t- ?% n w& }+ r)
8 c' |# J. W! o% f0 J
; N2 {1 E! Z( h: y! I6 \func main() {, G+ Q8 s0 c1 N0 \9 g5 ]1 ]
, Z x; G$ x' d( f7 Edb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
4 K) v% o" B f' p, O: [1 D* D$ ~/ q+ s* _8 A- C, U: p9 E
if err != nil {
$ U8 v; x( r; b! O# q0 f( \( s6 L1 }
' d; J" Q+ R$ N" {% Olog.Fatal(err)( f8 f- b0 K: c0 y2 ~: o0 d
# l# h6 V! ?. D4 q M; F7 U% p1 Z
return nil/ H* X1 Z. J5 d/ o, P( T, a
; w' L% I z+ K n1 H/ O
}
6 c* G* z' f% w% ?* V' h# L; S$ x3 g6 Q# {+ w* X$ G
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
7 ^/ h. x* g5 o1 ^0 |" `9 \0 ~8 d8 o5 ]2 c+ N
stmt.Exec()- t9 W' t2 d- d* x1 G
+ M% ^* M! D5 K' m# a, \
stmt.Close()
' p4 F: B! q# W' b
# y+ `( W- o2 [3 Q4 K}
: u4 N8 _* a" e; l2 ` ?9 N. r, l. f+ _6 `
二、数据查询 - SELECT# w# s1 S% X+ ?' A
3 ]& t' [! I+ r: Z& @* ?
2.1 : DLang 查询数据, k) ~7 n/ X( b0 e1 [" O
f% a2 F) w1 a. [ ]( h4 ]9 X
import std.stdio;. `* z. |% {+ q0 n# ` E8 B
1 ]- J n5 o/ R% H: g$ G9 A
import hunt.database;8 C; z2 g& z# ]0 C9 B9 D1 `
( y: i* e& i- u8 x) lvoid main()4 |2 x( I1 R g) Q, L& N
0 c) s9 y) @7 g& I
{% j$ e4 q- J' @1 Z
- i7 x# r: d# r, w+ Vauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");* o1 _: O, Q* E* f m8 c; \/ E
3 M( o, D/ e- U% y6 {1 d4 k/ w( y
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
4 }$ w0 t9 w _* e/ h% e" i/ }+ c
7 `5 n$ O, I8 }8 C{7 Z' b/ l% e |4 F
3 N6 p+ d' W/ x& [- Z1 u
writeln(row["username"]);! B i3 n6 G2 {7 ^. W/ y
# f0 p" {% K, ?/ B
}
/ ]6 B' B8 H; V9 Z& }# V
& ~6 _" q5 `# ?) Mdb.close();/ z0 g" s' b9 Z F+ x% g
( i& ^# p! n- p" B; B' R}
0 U% k8 G! r2 G& X4 c. l9 k! u6 A. \$ X3 J4 J& W( Y* z
2.2 : Rust 查询数据( z1 _: g% v8 |8 i6 H
* X: N+ |2 e3 gextern crate postgres;
8 t7 j; l* A+ z* K" B) Q4 S
7 c( ^; P' _3 c5 i1 \ r* Uuse postgres::{Connection, SslMode};9 v5 O, \/ L4 C5 y
$ C9 _3 V; w6 w+ O7 Ifn main() {0 Q0 j# l4 C7 w. y
1 n. k; E0 ]' M2 Y% J# Flet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();3 u: e3 T3 C# X, p
9 r7 F' T1 B* o
for row in &conn.query("SELECT * FROM user", &[]).unwrap();5 V# d* {1 h7 e1 Y4 p5 ]' K
2 h( j/ w6 t# m/ G8 E
println!("Found person {}", row.get(0));$ r$ Z( I+ r! ? H. p; G
& w: G$ d) ?6 a5 d8 T
}4 I; t+ @! D0 R5 V( r& R+ B4 d' P
, P! h" B4 P1 ^7 W}* i! Z8 _; K/ E5 D4 @8 Q
$ J0 V. c0 E% {! g4 f; f2.3 : Golang 查询数据' y, F; M" A( E2 K: v+ C
* x) p! j- q7 Wimport (: h8 P6 z' G n9 t2 }- S) [
1 \- H8 u/ Z7 f
"database/sql"7 S f, x1 B0 p; X; [# M5 h
/ `3 R2 e! Q; V6 z ~( K"fmt"3 _3 Q* O- ]% }
- u6 q3 y3 l: R5 {& f
_ "github.com/lib/pq"6 M3 f9 J# S( {; v1 P
, Z3 S- N# g# z; ]8 W- b2 [- I
"time"2 D! {9 e# N3 {$ [: [5 b; x
% k1 Y. _' E3 B! V5 C! l"log"
A. W* k& L- ?2 o0 ^& j
9 q# Y' O0 E9 t {, r, I& s' C, S). X) X8 ^" l! f6 n$ }: v; v( a
( t: F: s, h: ~' w: K5 mtype User struct {# J; P; M7 ]5 g! q" w1 D& }0 z
" {5 U: \3 s/ c5 R0 }6 t7 s# XUserName string3 d4 T! A6 C: ^0 ~# ^' b
1 V5 M# J: \1 H) d
}
7 B2 u4 q4 C7 K2 s! ^& h1 U
$ |, [$ N: F/ _% Nfunc main() {5 X8 y& Q) K2 k5 e6 t5 Y3 m
# l/ O, L k# ndb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
$ w% O0 a% M. h K: h! _' y0 f* }! t+ D& s
if err != nil {$ Z/ p* m' Q0 y8 e! }+ ~$ W
8 A$ D3 ^( e1 P! e& j/ ?+ Xlog.Fatal(err)
: R( Y7 _/ ^) X& b! U, O# E
. v- C! F) V& S% U: ireturn nil
E9 `* o9 H/ d0 f6 v5 q2 t: {3 B- n9 X1 i( W
}/ W$ B V# N# E- |7 N$ }( f! ~8 P
; q; O0 n) C0 _- Suser := User{}' l5 {! S" e1 m0 V' G: c3 a
2 ~4 C2 B) g. d0 K* h) [" z( p
stmt := db.Query("SELECT * FROM user")
7 ?3 `5 `3 h& v2 K. n* U
# D% S* ~9 w- \3 T# Z, ~for rows.Next() {
8 p! F# s6 R4 u# S$ i3 _& T. C. u7 N1 l; n3 @
rows.Scan(&user.UserName)
% Q- m& B5 H4 ~! [9 S2 _$ H% c6 O3 @% R' \. E
fmt.Println(user.UserName)& ^2 L1 Q C3 Y4 o! c5 K. K
0 w% D1 [% W3 n X* o$ \}
! `. u/ w3 g- ^- t. D/ N3 y& f4 n' y: q" P' C
stmt.Close()
/ z& j! [* R0 X: K" D i: u( s
6 H( [/ Z" d% ?. x$ }4 s2 a( f' y) h}& }& K, M, s+ [2 R( G( F
" @+ G( F6 c! c1 Z5 S
三、总结
/ {* }! n3 y0 s6 ^ T# F" y$ T; x2 U+ ^/ v7 g
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
. L. |/ _9 ]$ o4 E& }; L* V# t& c1 h* r4 U2 ? a& ~0 ?4 s
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
* _! \+ G% p4 Y& B, j& ]/ [0 i5 \3 o% A. d! Q
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。3 L+ Z# H2 d' d
" ?' _7 [/ y9 D N) x/ m/ U _# ?
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
) \- k, i0 v5 m) x————————————————6 d" Q9 y3 e) t& C' @
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, z ~& k" S( r8 a/ u8 ~* `原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
3 ?1 O6 F/ ] Z6 S. F. m v$ K# s5 V8 j: p3 G' K
|
|