管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。0 }6 w0 c9 y2 j/ U/ Z& V
2 ` N! u. J* ?5 u一、数据插入 - INSERT" {6 K$ @ c5 l
4 z+ [* m: j, k$ W. \) i1.1 : DLang 插入数据3 G+ A& \! x3 d( k$ h. n
! X& |2 G$ r$ F' A% j' Gimport std.stdio;
# Y, E, A3 F8 ?3 B+ @2 y0 ~9 w" x9 b0 _! J+ K" O. k
import hunt.database;
6 a- j9 K+ q) l% W3 F C: G5 m) ]/ ^) ]8 Z5 U! }! o7 ` \
void main()7 K8 |( m: u2 _1 |
/ J$ [2 b' @$ O3 ^, q{# b/ B g y5 G; f9 n4 i# X
' n/ u3 q- e& k: f. \6 `8 aauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");; m* G( l# Y0 x! O' V* T8 M% y. W
5 p5 k* X$ |. l1 `/ D
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);3 U1 C+ l2 J" z0 O7 |1 v/ f6 d
6 g ~$ ?" {# i$ A( B* U/ f' p// 打印插入数量/ ]* `( m F2 ?
- Y, I$ T1 T0 E2 _9 O' ]3 _+ H
writeln(result);* |7 k$ p+ a& n- Z+ O' [' S
+ C {/ |1 S! N" pdb.close();
$ G1 d4 ?( e) a6 O5 ~
. z. \% ^ h9 j3 K4 s} M. T, S a. H
1 H2 s% o- f- E+ A$ b, }
1.2 : Rust 插入数据, _' z; O: _9 ?
2 P) n9 Q% J9 ?extern crate postgres;
8 U# G# E' v* T- e
R9 w, N7 @, o. M( Q' z- iuse postgres::{Connection, SslMode};
9 X. M; \/ c0 d) ?/ _
1 U: O0 t+ J7 F, T6 c# nfn main() {
& ~$ C! u/ ^- G7 a4 o4 E7 }2 G. Q+ T3 a# N% p
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();% M% ~# f. e6 h J; W! t
; Y k! ~ X* D, q# i. B# M Vconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
3 H% E& h& a0 F. i7 K
% V; z$ s i- q0 N# U/ o}: h1 [# z- W& M" {
! M8 o" ? e! _8 c+ j: w
1.3 : Golang 插入数据" M4 I+ z+ a- J$ p* C/ `9 r
3 m# L. \% c/ U1 ^, S3 S$ D; r! y) vimport (
( Q# L* s* ?0 F0 m" f9 r
( l( Z! Q1 r z8 _5 {"database/sql"* P/ [5 F0 E+ W% u$ s! b+ P
, x* w) Y7 d" w* E4 k& @/ c7 l9 ^"fmt"
& e+ @5 F3 N0 ~, a& Q) T( Q0 s- |+ i1 [$ e. a
_ "github.com/lib/pq"7 A5 n0 v# Z& j0 W5 f* c
" m$ x. r ?& L& z1 r8 ^
"time"
9 P" v. O0 @5 v" @1 o% _" @' s( P6 K# V/ D7 `3 e6 C
"log"
! y+ r+ o& p* A1 \) S0 X- q, J, i2 ^+ X" j# c
)$ W0 N1 w9 M) |' [8 n/ n
1 ]& d0 n W9 r. Efunc main() {
" i* K" _% q' p D7 b. b" F7 t
' ~+ @% X9 e" q$ Ldb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
, c" o9 G5 U% V; a- I0 p" T7 y/ Y7 e7 r4 ^( m1 F
if err != nil {0 `+ \& B6 R; E; e) A" p6 f* P j
# s d4 E1 |& I- m
log.Fatal(err)
; ?) o; D! u5 n5 D
+ [9 w% Q5 F" I- z4 kreturn nil
+ [" j) n5 ~- j L, C9 m( J0 u& h9 v* }8 z% e+ F: D U
}0 h: e# S4 t. `- E, l
3 E/ n9 N$ a( I. j4 e3 ~stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")2 b: q1 w U- D: Q, u
8 J) \0 K! M9 {9 b! ?stmt.Exec()( R P: V! }# S J5 q; t* W
% v! @7 \! U; zstmt.Close()
7 z$ Y! k- ^, X5 Z) e. T0 {( f& Z! ]6 N. V* J
}( |6 g5 \& o& k$ Y' U6 s/ W S
9 \$ @. w8 E# ?( G# ]( m {二、数据查询 - SELECT E. d7 _3 n2 A M; v( i# c0 \
# h- L8 |) y* l4 q1 e1 e$ Z2.1 : DLang 查询数据
+ R, r( l! G7 H4 D% | b% v& C% k- ~2 P& r2 A
import std.stdio;$ N# K E4 e; Y" Q5 V8 P" f! r
6 ]$ H. G7 z" g
import hunt.database;# t" q4 @2 P9 s9 W. `* c
& r. c3 P T! d5 ~; w. X. m
void main()% i: F+ W! ?* ^" ]2 X \0 ?" q) v$ ^, e
9 M! o' I, W7 O/ u0 I{3 W6 m! I1 q* Y- G: n
6 E7 X9 o" P1 A; S$ ?8 a, }' R+ `
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");$ {) U2 C: S/ {0 P+ j. C( y6 o+ g; |( V
- [0 u8 K4 M* ?( T
foreach(row; db.query("SELECT * FROM user LIMIT 10"))) Q; b' X8 _3 K2 r9 l9 t+ q/ I0 s
5 ]. V1 E8 o( i- p, R{
! h* k/ U+ }7 T8 x; v/ f7 A7 W, t8 h H3 T
writeln(row["username"]);
" @% P! r" j: d& d' n H9 b! f7 N' e2 J1 Y
}8 Y o4 r. r( i; w$ v
A. e# O5 W' T: o6 ^- \
db.close();
) s5 V* ?6 R F. l, |% V) H) V8 R
1 V$ c2 I# |- z}' x* v7 Y8 [7 I' M3 l
; r, V" J+ w y" a
2.2 : Rust 查询数据! {' B: H% T/ d3 d
+ k* C3 `- k- Iextern crate postgres;
9 {, f; b3 J8 s5 T- d$ c y$ L, p( q
use postgres::{Connection, SslMode};
/ s/ q3 `2 `# L. B% E
$ \& m* s& ]4 t0 kfn main() {
& B9 j/ I* t$ L7 O! U/ U) u1 S% X/ o) x3 ~, t
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
3 r: ^0 [7 Z+ {: x! ?+ D6 U z4 {( [9 }0 U- X: J8 J* N
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
) F# w! E4 z* a: }$ p m; l. ]0 G% z. C f, K5 h
println!("Found person {}", row.get(0));
! C# U4 `: _3 d2 [1 e) m1 d6 P/ w* h* c3 E5 i+ y' }& h
}7 }- X4 \3 b1 b- A/ S" j
$ H# a- g$ u! W/ N1 i4 G
}4 G0 A! J$ k- y: Y$ G+ A4 I
7 Q2 x/ |5 ~. ~2.3 : Golang 查询数据
. @8 [! F7 w% D/ B! M- M
; [. d r* @" simport (
; t1 N2 Q2 {4 L% f
- `7 }! q( A. k- t"database/sql"5 ]9 }2 E' n7 i
& q( Z- Q% n5 @, E0 J( S( x4 J"fmt"
. X) h& o5 d- m2 ^9 W8 W3 A ]0 [& Z
/ z9 y9 F. n( `3 [# I5 \_ "github.com/lib/pq"( ]& a4 J; E t% D# {1 |: _0 F- j
/ }8 O1 v7 _2 O4 |5 D
"time"
0 k" s/ S7 S$ |9 K) c* e
& [" s- P2 B: S8 k"log"9 ]; v( U; F8 ^' P
- h1 v6 k- F$ ]' G: p# h( W) U! S. [- k5 n6 X" C
1 T9 {/ b' l2 X% W$ ztype User struct {
, |0 U" J+ [: k7 z, g' v
& J8 M/ \5 N8 N6 h& ]UserName string6 Y' Y* ]$ \8 X3 h4 X' g1 s6 v" A
7 Z: W) n. {! N/ S5 |
}
) I$ ?3 r8 ~1 f, D' e
5 Y* {( X# g$ k" I# [: Xfunc main() {, r# [ f) {; ~/ j
a% I. b# ^" g% V; `
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"); L8 p: J; P* o, }: ?6 ^3 ?. |* a0 P
8 e" @6 `$ v' i, ]if err != nil {
. L; h( ]4 p C6 ?, q, l& R
' ^$ a) ^$ X. r% E3 W/ ~7 Llog.Fatal(err)
2 z+ E) O J! h5 o. c9 o& j7 a o7 O8 A$ X, G* W
return nil8 E6 O7 s8 n! s: ?' {! l
8 z* X+ D7 s5 E, W6 N
}' O9 Y. Y, \9 r9 D w
+ ]$ v: ^7 Y7 u* u+ [6 Yuser := User{}2 Z. Z" I$ o4 B- _2 e$ y
1 L9 ^6 D8 {4 ^8 |
stmt := db.Query("SELECT * FROM user")* Q4 I# f4 f# R5 @+ Z
0 Z# R, ?8 P; r6 dfor rows.Next() {/ j4 |" h& y3 P
+ X' x. o3 i, A: x. q
rows.Scan(&user.UserName)
# l! i- n- ~4 d$ T: W+ |) m1 Z7 D! _6 `5 V
fmt.Println(user.UserName)
# X7 E1 P2 ?8 V7 y1 Q u8 {! u. R. V1 t. [" n7 I" p/ ^
}, p- ^2 g4 v3 E+ w) Y
: a2 {5 k1 o6 ]% u
stmt.Close()7 I. n; b# l. x" U( s* _ |
' x! L; o+ ]7 }2 Z7 {}7 \- X+ v o4 T3 _8 b! p. A
9 i; w& X8 Z. w5 h( I) M三、总结
; L3 [7 d; X6 X6 n. `% s& ?; A* z8 q- V4 ]8 j, }; ?
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
. C5 }# |5 ?9 @& ^' a' [& O1 }
) ^& D6 d$ e9 X这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好); @# ^" G! i9 p- }2 K/ y/ N5 H+ H. r
# y. W0 G) `# k% m在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
6 Q, A+ h8 z1 O% D( x% f
- |) H+ A) ?! K3 A, t- D+ Q* ]总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
3 F+ q) k/ T2 S+ x I v2 I2 f+ z2 B————————————————
5 y( A# ~$ u3 F0 Q: N版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" b1 y, \& |2 F原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
) t' G. r+ F+ s3 |: a9 T" n7 t. f% X F* r* |3 ?- |0 U' Z
|
|