管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
" E, r" b |3 H9 O: U& u
- q8 I8 [- X7 d; t一、数据插入 - INSERT
9 n; l% [! Y6 \4 G+ I) {/ y4 T0 Z) t5 M
1.1 : DLang 插入数据- I% k x O+ p0 o: W1 [ F
' a) Z% |6 C! N2 }- z$ [/ @; B
import std.stdio;3 k& ]. L/ {+ Y# I- J# u. x% x& A
' v, I1 U% g8 J; O, ^3 [. v n, V; dimport hunt.database;1 p" j) o5 p. ^ Z3 [! m& Y) X
6 J$ e$ a3 E$ ]- t# y7 L$ O! W* Y
void main()
6 O# B! `7 ~2 |2 Q
1 J+ _( c3 m8 K4 V{
. e/ v5 b' n ]+ A
9 r, G, E+ R& I. |+ F- C( ?% ~auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
U* [, n+ x8 O2 T& V, s3 z* h
$ R. K8 z- i2 m) z. A* mint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
2 `) z( |: o( p( _7 V g+ x6 a5 h' T$ O- }
// 打印插入数量
0 `: }# w* t( V; d) z0 D% N [, p
writeln(result);3 K# D/ g% U5 a2 ~# o
8 u6 r8 p; D/ J- Qdb.close();' j) d. l- Y, O6 B
. ]0 |8 @3 ~6 n
}
5 i3 @4 ?6 e0 y a4 s
! a p! R) K! L, j) m# \' p. K" S1.2 : Rust 插入数据6 E: U8 g0 o Q% }9 Z0 r
6 l$ ?& ^6 F3 E2 Z* Hextern crate postgres;
$ h {9 j. Z B1 O" ^# l7 I. k- c/ B! U |2 R4 y$ A
use postgres::{Connection, SslMode};
- `+ q- c1 T$ b
* z2 t; h$ }# |' hfn main() {
* f' ?1 i* K8 U
9 O$ x6 u6 P( y$ wlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 l1 q. D7 i" T- m% [
/ w4 o. h; O( N( I! wconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
$ n; |' g2 O: I7 [& ^! z8 _$ {
$ N1 i* \8 n1 P- ^1 z; S. F}$ [ S3 c# A" g5 J6 M9 w2 b
7 [; \+ F D! @+ ?) Y; f1.3 : Golang 插入数据+ W1 v) H' w# j* w6 o0 R8 v. H" Y1 q
) O6 Z3 b! [' M- y2 j
import (
6 d5 z/ {7 `6 a! ?1 c0 _, O" x& r% I* j* e3 l' y0 \2 i6 a
"database/sql"
! ]; j8 |. _8 O! v8 g9 E" H7 F- O$ b& ?
"fmt", n* e/ Z/ u* o- B9 X( b4 t6 X5 V
, H8 U2 _- Y0 P9 C% T_ "github.com/lib/pq"* ?" _) d a' D+ e9 }: z
7 O4 ?, L# y o"time", g' C& i0 R/ z& g" J/ B! U
7 ]/ J& B' B. Z
"log"- w0 h7 X0 E% ^6 l! M
: [3 R5 _& w' [$ J/ U)) I5 w8 @ q$ Z8 e
5 K/ w/ B% I* n! B( x. |2 h: G' ?func main() {
. v' k# [" w& L2 `( {7 P
0 W- J5 [# a" y, ?* @db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
' ]' H: g) c4 M2 u$ e; `6 K
8 p5 i9 B: t% p' g, l6 y9 W# nif err != nil {) T2 D- i; C( H
( ~% O2 H% m6 z2 rlog.Fatal(err)9 I( D9 c5 m+ n) {) w6 c
- F" a( D. N; _! x$ Q: x$ ^
return nil$ v, u& N7 r( O1 B
$ p3 K0 s: g5 _. n8 D
}
& |3 Z" K) F; a& N
/ i" K+ i7 b* `% p- r- bstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
5 |" ?7 e$ A9 m- T% G9 A+ P7 ^2 ^# Q% |. h, }; j
stmt.Exec()
$ ^' e4 d% D6 b& @' ^! ~% D4 z$ |
" i( N( }% C4 Y+ U8 G, ]stmt.Close()
6 H7 @' E/ V: V, t) Z
, V- i! | }7 V: k}
$ b( Z" S+ n5 c, ~
& h. \1 X7 S W. `+ [. J& u$ w二、数据查询 - SELECT7 y2 H$ y0 Q6 H& Z' P, Z
/ ^. q8 n) ]- W, l
2.1 : DLang 查询数据
! W! h0 n- |9 a0 s) \- |! L) z8 S9 A
import std.stdio;' V; A% P+ M4 J; F0 T
8 | i5 _% `, E0 N; J+ Limport hunt.database;
- ?$ M" ~1 ]) z, F0 a# Y
( x2 m/ I# Z5 w; _1 [$ u# Bvoid main()
+ D# B+ K6 U7 W; T% v8 u) E
4 ?4 v; l! }3 t) S% c{
- h" c8 d `. r/ |
`5 y2 |3 t% `& D oauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");0 t7 u: M$ u: B/ y+ f
- C0 T# ]! O' Q1 V+ y! l% l2 cforeach(row; db.query("SELECT * FROM user LIMIT 10"))
& d% P- h ~5 N& u- b u. D2 F( `- o! A3 h; Q$ ^
{
: S& a4 P4 `; a) \& ~& B0 n& |
& U) Q& x% y& Pwriteln(row["username"]);
( A% M( k* _" f) X3 T. L" f
8 v. Q+ d# p% N- M}% b9 ~3 Z$ s5 @
g' ~6 h! q Q6 J$ [db.close();6 U! w, n9 K @. ]( {3 n6 c
: ~$ \5 Z1 h# i; J}
+ ~2 D/ }* Z1 `+ g8 V
% m0 p# ~# [- W7 l( h2 l2.2 : Rust 查询数据
# _* ^8 k* ?: s Y4 H0 w/ a- E! Y& t o* [" g
extern crate postgres;
& o: f; P3 `* W- f# |& z8 J, k- x- ?- V6 ^
use postgres::{Connection, SslMode};
2 D* b- R- z4 y9 b7 S; r
+ L8 T9 B& h, X7 H/ g( Efn main() {* S# _& V* B( V) s: S2 Q9 f5 _
1 Y5 V _# B3 l
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
! j# L, d4 f8 Z( V. v8 a1 M& i* [2 w
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
( J3 D+ z$ ]5 P1 e
" q! H6 h* D( l- d T& w4 B. Z% Dprintln!("Found person {}", row.get(0));0 U+ h3 k5 J9 b7 E' r ?
- M0 r( I2 Q. s$ r8 ^}# b- s2 S- u3 h0 i7 d
1 ^- K4 L$ x N
}
- g9 ^( b' j' I% B& {& ]
7 v! [+ c7 ~1 C! \: }( B2.3 : Golang 查询数据
( x, ` `) ^$ E2 y9 C- c7 Y% S3 v0 H2 Q+ Y$ v+ h0 l
import (( l. Y1 \- e5 I. y D' p
" e# H4 n S+ z8 x8 k"database/sql"1 k1 Y# o+ f6 o6 ^, [ t
; Z8 W) e' j( G' L2 F"fmt"* R3 R$ f: ~: I& G' N
0 d8 ]( P* M( | c: }; j_ "github.com/lib/pq"
, J7 W- g- _' R' m* v8 N& g
8 _1 k2 h3 u" Q+ s"time"
9 E, x* \" [5 w8 G2 X% d: y6 F6 \# V- N9 l& ^
"log"4 q, s7 f u6 U+ q& F! ?4 U
3 w1 y+ g1 L# C; |# D)4 L( J, {$ F: L( _
# V3 R7 B( L0 C- J$ k
type User struct {* r5 ], U/ E4 c4 [8 Z4 ~
0 X6 V# k3 Z# Y. `5 vUserName string7 p4 i3 p7 {% q" X, |. O
' c1 \" S$ ]. j1 X" f! \# Q
}0 \% f. b: a% Z9 e
+ |# ~. Z1 e/ s' G9 |func main() {
/ w; V2 Z; s: ?3 z1 |9 W1 l, T# d. r% C. X% ]4 M6 p
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable") P b4 O. }! e% `1 U$ L R
2 e0 G/ q+ e) G5 E# p: L4 l$ h
if err != nil {
/ d; d. b3 i6 t; A/ |
2 A/ R5 }5 s& c# @ e% x( C$ Xlog.Fatal(err)1 u5 k6 b1 G0 D; A3 [7 ?
5 e3 F! D2 [2 M. P
return nil/ i3 I1 O( b3 g/ j( k( M! v% X
' A0 _! u+ R2 j1 l! Z
}
* J" v( T& L, a( O8 ~5 _5 Q' i. _3 M2 b8 Q
user := User{}
! Z5 |% L4 C6 t z8 E& g( F0 j
stmt := db.Query("SELECT * FROM user")! S; @( a8 k1 K. M) `
4 J+ V" \1 N8 z2 Y; dfor rows.Next() {# I, x: g1 t8 B" D7 ?
) d$ h/ E2 P5 ?* lrows.Scan(&user.UserName)2 W6 X a: l4 O6 Z7 `7 P) |
$ ]( z5 X, w0 g
fmt.Println(user.UserName)# H ]2 \" V: y# _% g3 R
, e) @2 k, @ n9 \% W H
}
( i, k8 N! ?) o" @2 ~5 d
6 @0 r" H& D4 ~% H& B$ mstmt.Close()' [3 S$ F" u" o. u: C- r: W
& o' y" d, L8 T( |+ P& x
}
! y3 x7 g2 Y* g" R' j# }. D1 G2 m, C5 E2 ~9 A/ _' u' }- C
三、总结5 O% q3 |4 D$ u
0 q w+ L; o# _/ l7 k, g% d8 h对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。) d6 E" l- K- f5 P( I
9 _; m- u, Y) K q# x0 _) i
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
( i' t* ]2 l, z4 @) i. X8 @# r, H, V7 A" w
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。( b1 F) E; x" E @& t/ J
7 }/ t; {+ S7 c# d1 v7 N& _ m
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。7 i5 @, L* A+ _- x0 u0 z
————————————————
3 _ ~ o4 D2 t; h8 n; U版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。2 L! n$ z# F; s, h4 f
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961& l0 c: E9 x5 L
; [* U$ u) M4 Q: D# c; }$ k |
|