管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
; ~" {3 }" k4 V& M0 Q! @( H# _1 E8 B
一、数据插入 - INSERT
: G" T; j5 \) T3 ]2 N. ?) ]; K8 Y. ~5 }+ T; Y. b
1.1 : DLang 插入数据. t3 J/ d% W' \) N' R- A# N% \4 s
- H3 _5 q. @: o' O [# V1 A
import std.stdio;5 U+ C% [, V1 e9 R2 j' ]9 V7 H2 ?
; J& K# ^4 w* ^9 x5 q, Jimport hunt.database;
2 o/ ^, K# o" q2 Y u+ }6 W: o1 n
, S. ~# E( j1 e/ J" v0 [void main()/ n0 f, P S# u
# p' S3 Y1 D+ }4 O- C: o' ?{0 @6 e1 C' t% j4 J) j
4 M4 |0 h' g9 \! C0 @& g7 v, y+ G
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
2 }2 R3 r5 d" G( C, r0 s0 E6 o% r
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
2 `! ^- w7 s: J2 P
) e, `: x$ K# b1 G' l// 打印插入数量8 m# j3 |' [8 O5 v
, J# R, V. U" H7 }writeln(result);* h0 F; A+ O& Q8 @
6 K( p: K ]8 j% L3 U' v
db.close();
5 U; V9 e) l; r) A1 {, l; `
- \. ?! Q" u- c% d: t}3 O/ a- W7 g( \5 \- H
) k$ i* M5 C) P! H
1.2 : Rust 插入数据* h7 o! E D1 _3 X1 ~' M4 t# h4 S
7 O3 T- D D, pextern crate postgres;! a! J; ?! I0 k8 g
! E, B3 z, C. p
use postgres::{Connection, SslMode};5 N3 j8 L/ P4 V& ], z
8 i! c7 b# K0 h$ X
fn main() {
4 a4 k: b! z+ a$ ^; J' m! o2 s9 ^
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();+ A" w' w$ j# v
( w5 k' u- p2 x) V8 `
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
" [9 ^5 }2 @0 ?' u* ]" r9 f; A6 G. m% E1 q! h
}+ z7 X3 y3 n/ u$ L
" l) T1 d6 E. i E" b2 M1 z
1.3 : Golang 插入数据* x [& O$ H5 {% i- S, f0 m! P2 ?
8 @# r; X B9 i, c) ?: `& himport () Q$ x# s+ i5 ?4 h6 p
) c0 m3 n/ z1 f# H, R3 U5 m% N"database/sql"! y$ A( E$ n/ T' F
0 P6 f$ `- L( p7 S
"fmt"
( q5 x7 q( e8 Q- a( v
% i$ T6 T& E, S5 E8 U$ `$ v_ "github.com/lib/pq"
8 Q c$ Z; K" e- o" K4 Y3 G2 ?0 I: U# x# m
"time"
' V y. ^9 |4 J7 W4 o! j; E) y/ Y3 y
: e: s5 C% u1 b3 k"log"
* ^$ I9 m" H2 P5 J9 L: m- }* ^8 I1 N b2 ?% a
)
5 N+ Z0 z' i, {8 u' J7 x
9 M) @( w+ F3 M+ Efunc main() {
7 k2 [2 O" q+ A2 l2 M- i* g7 d4 Z, A0 y2 }
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")% G1 w. D6 |" q4 F; O5 t& F
' n* Q# L& q8 V' i
if err != nil {
: R: ?9 d K' ^. c A
" O; D# K$ S5 t9 w2 A$ }- W9 Wlog.Fatal(err)& Q( v# b3 }; R# ^& _+ f. L$ s
~! W% K4 I# greturn nil d. {% E. G7 R& U4 H
8 v4 ^4 r4 a) s4 j; q) s}
9 q, |4 s% e! A1 l0 d6 x+ b6 T7 ?" v$ f7 ^& [7 d0 X
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")( J, ^$ L4 a L1 t9 s- h4 H( S' C
8 c: ^6 a/ r6 r9 F& H m; C
stmt.Exec()
% c z) H! ]% W$ j: Y* i0 R. b: ?) B# i0 R/ q5 S/ }
stmt.Close()
4 l, p) w* N1 }1 j" n' ^1 a9 D8 N/ u4 k: R( L" w1 S
}
5 X/ C0 i$ ?3 b& u- \/ r
@5 I( x, S# q0 r- K( F二、数据查询 - SELECT
4 e a, H% p4 V
- c/ z9 n3 z4 l, R- Y4 T6 P2.1 : DLang 查询数据
. S0 r. O/ B5 v* U4 r9 e" m5 x- k2 h% M% J+ ~ I# J T
import std.stdio;
4 q2 i4 _' K3 y4 |; J2 o# N; \8 Z( C
import hunt.database;
! M- w+ `& d( C* h& n- z
# t+ L P% U7 W# Hvoid main()
1 F, ]9 t! F) R: b* \* D) F9 @/ A$ ]" ~4 c
{
& I2 w8 V0 I5 k2 E. F3 u" M2 Z) C8 h. n1 I+ y2 b4 F7 y& }
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
, a9 L0 q: ]( x0 J& k1 c: R S! Z6 a7 ]$ x+ ]% I- b, [
foreach(row; db.query("SELECT * FROM user LIMIT 10"))! i j4 [9 h7 _; C) E5 q8 @4 y, _1 G
: R$ S8 U" c/ H! s% R9 z$ O/ p{* C3 \& {* q" @. V' n
6 q- J/ `2 Y9 G: _writeln(row["username"]);
6 m5 x0 m# v, y( z( I; W' }1 p( j/ n! O3 E. D
}
. i( o; v8 J: G4 r0 @
9 U! _9 ]' z( L( R' Kdb.close();
9 a$ l3 D t: D3 t' y5 N
- w, i; E+ a. G' h# a}, |4 B) ^4 d2 a* }
! E- }1 V! Q' M: Q" t/ t2.2 : Rust 查询数据
9 ], Q% o0 Y# O
/ F$ V/ P; @0 ?% W+ fextern crate postgres;6 r+ f. a/ f4 v! ~) b0 @8 ~) `- s
/ Q. @# X2 J; v; I3 `4 R* Y: F
use postgres::{Connection, SslMode};
# H* T! n7 ^1 `! J# B+ I, w
! U; D( l& |: {7 {" }, g* `' v9 H5 e( Dfn main() {
1 o/ l0 S/ U' L; r: ]; D( u( E+ B" B/ x
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ N u& _. q# @$ M& g# h+ \2 [" g1 @ M+ ^5 o: C/ j9 c
for row in &conn.query("SELECT * FROM user", &[]).unwrap();0 @% t- u2 T8 D/ q
; `( z$ {+ O$ N: F3 p4 z" t
println!("Found person {}", row.get(0));: P2 L; z! v) p2 a
+ j( _, ^) q9 {& W( O8 [
}$ q# o9 @, G4 Z- Y" M
) O; f5 }* ]/ j/ @9 B}
" g j+ O! m" ^) b& b5 ^& M
9 q% q# E t# b2.3 : Golang 查询数据4 V6 P5 `" P( I- V/ w
+ u* C6 U" [7 U
import (( V0 A% c" k8 O8 g. n) o
. j' k: {0 z: z' n7 x"database/sql"% B: K: X, e$ c! w6 a8 M
/ G9 }% A4 B- p9 g3 t M
"fmt"
& |7 y6 X) O/ c6 [6 F; V! Y7 {. _1 l( z/ m$ i6 B0 z
_ "github.com/lib/pq"! d: U0 {0 u I. @. Q
2 }: i2 q# Y! u& r" K$ q: F/ h! A1 H8 c"time"9 J5 s' z* l0 ^) x# c
; e' d" J$ P$ L8 H# [
"log"
5 Z0 @9 e: J- p
! b' f$ w' B% g) e$ R% ]3 |- N- _! _+ F)
% E4 a3 x) I3 t9 B1 A2 q) N
2 ~" ?) V' n' Mtype User struct {
" L" t# D7 K) M" Q# c' t U9 N' l0 u9 v& U- Q+ I7 J w
UserName string0 r3 X* C8 M- p4 Z% E- f
" F7 |( s* j) Q/ }& e2 W0 Z O
}' O) w) g* o$ V6 `% a# z; w
+ b# g$ }2 N2 D. b+ V1 z; [
func main() {9 ?& F$ l" J4 I
9 Z3 ~5 i0 v( tdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
8 ^6 {3 r% s5 J! a! j
7 Z( D; D1 p, J6 j- H/ r/ Z$ Wif err != nil {' I( s9 _7 M! s# r
4 b* Z" X. }' K1 n* Z5 Clog.Fatal(err)
# @ l5 U& |. Y7 Z9 Z* e0 K; D; R& e
return nil
9 Z* [1 j- k0 u+ ^1 \5 D; z
+ T d! H9 M" {1 b# D6 N}
* H" @, `( b. |5 |& ~5 R" W, o. Z8 T! g5 F
user := User{}
, K: K' |) r# p2 T b* F) Y- y- U( ] d
stmt := db.Query("SELECT * FROM user")9 J0 v$ b% u$ q7 A, `. E
, A9 W2 g7 ^8 [5 g- m
for rows.Next() {
! }* G' _. H ~2 K9 ], [
( \$ f3 z6 @- l: Rrows.Scan(&user.UserName)
! X, L# Y" m6 H; ?
1 Z( Y! R2 |) Y0 \0 mfmt.Println(user.UserName)9 I8 Q( q) w6 ?8 y) C( x! h5 y
. p; T6 a8 j" D8 g3 n4 B7 n
}
7 b% ^9 B7 M: j( k; W; z
1 k/ [% P8 Y' y+ }" p; ~, ~stmt.Close()
; Y/ D. e' B( j+ @! ~. \9 `: B3 `* J; V2 e: G
}( Z8 o& x5 ^) p) J8 T; E
: ]& x0 h% h, H( y三、总结
+ h. ~. Z/ g3 I% ^& m& w; {8 }$ h% L9 W* O
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
4 S7 }+ m4 d3 _: @3 ~0 ?/ p! A% M) j
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
! v, ~! X9 _( s( @3 J
1 y+ f7 W4 l/ [; Y在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
& T$ R( U* P A# _7 `
0 K1 O, a* d0 X2 w! Q' J- w总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。* D8 M+ i- W7 A% u
————————————————9 ^" q0 k$ ~8 H6 `. g5 Q& ?
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 w! c" z7 J# ` j( T
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961& f) l$ \6 G* m# m4 H# P. O" e
2 K3 k/ J. D, ~6 d4 U* D( L |
|