管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。3 t3 i) o9 v1 S4 T8 T {( r2 _
# P) Z: h; _1 J; M; Z+ P! s
一、数据插入 - INSERT
; R+ k0 L, t. m6 X) D3 j, Y5 G e
# v4 }' M3 D; W6 V, o1.1 : DLang 插入数据% ^0 C. I3 x# s2 v1 ~ n4 x5 I- ]
" j7 M1 q4 C2 ]/ ~6 uimport std.stdio;
8 H8 z, M1 E- q$ J8 J$ }" {% M/ L; b s2 @* s( j
import hunt.database;1 G& t# W# { y: Q& Z$ O
6 }+ m7 t. r( s+ B: m7 v, N
void main()
7 c- p4 f: L b' D2 r0 d0 J2 P" o
9 t' K' \- \/ H{
: T, i# m5 S' F; D! g
; n( \6 J B9 {( E/ [0 z' x" j( ?auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
3 x, f" o+ ]; y- H/ Q
( A( g. J3 d7 s$ f2 Mint result = db.execute(`INSERT INTO user(username) VALUES("test")`);' y) @1 ^5 V3 ^
( C0 B6 P( L8 {* J! j// 打印插入数量
0 b) {+ H( p( ?
1 U6 R; i: {% ?& Iwriteln(result);( @" x: `7 s- U9 U
- b2 N2 i/ _5 M4 O4 }, n9 k* _: qdb.close();
7 X P" y' t- d! f
: ~; J* W' P; {) D: r1 H}. A$ n c/ x P$ U& v4 ^
3 [! h$ n/ B* A9 V4 t1.2 : Rust 插入数据2 A2 q: f4 V1 G: i9 E7 r& r
% H5 E3 o5 T. p: y# Q, Yextern crate postgres;
. M$ g( X' X8 v/ m i) L
4 n+ G+ C* I8 ^) Vuse postgres::{Connection, SslMode};+ S- b5 w c: g" ~: o
- {+ z1 ^3 l5 ]6 i
fn main() {# }! \7 e8 E' O8 @
% v$ i% g9 ]$ M( c/ U; b/ m7 I
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();; b6 w9 i0 x6 W! m
# }% g: P4 ~! y; D ^1 |4 Sconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();: {1 J; i+ Y ^! y' ]+ o% z
! I4 r: S+ ? M* m- T} _7 z/ G$ h0 r- u, r% E
: D" Z+ F9 H6 o1 o9 ~
1.3 : Golang 插入数据( S; o3 t5 I7 ?3 F
$ s: }' |" b/ e. g. `+ p
import (2 u) u+ ]: ~/ z, S
, H1 i o1 |& z6 N; u( B"database/sql"9 L' g- B/ d, d
. s5 S$ ^' N; s5 D. o
"fmt"
: F0 H: A7 E1 Y/ m( C0 Z) ?2 q& {) a$ _- b, t* m, s; j
_ "github.com/lib/pq"
0 _9 \4 n2 q9 q& G& J6 o6 f# L
; q+ \5 k4 b1 t4 z+ S. y" T# `"time"
( ?. H$ h) S+ _) E4 V8 O8 R9 D: @1 u/ z+ a- \( |$ a" e L
"log"6 I$ L; c, R8 q8 P; N
5 T5 ]8 ?6 d6 l0 g% g. i4 \)
3 w! ]) L6 E1 E
2 ~2 O K4 D8 K. F# ^6 q x$ L* cfunc main() {2 x3 k6 r, N+ [. R) C7 ~, Y$ V( R
2 @# e3 S& C! [' `0 l+ {
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
+ A0 Q4 t2 j% ^) D0 c1 v8 A
r8 J+ \3 N" z6 J: h* g% Oif err != nil {
Q7 n* |( u5 ~0 g e, r8 M; x$ T% Z$ O
log.Fatal(err)' ]" O2 x& m$ c3 t, p
3 ~# |- Z/ P, R3 x0 Ureturn nil
7 ^* w M0 g ^9 c M
3 Z$ H. L7 f+ C4 N, U# \/ x}
" A0 W" `# ^4 T/ s8 r, A0 ~
' d! n: r B# |: o$ Hstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")7 q- L7 q. @+ y' f; O; v6 }( A2 H
7 m* S7 y# t+ ^7 X4 }7 h' I
stmt.Exec()" m+ W2 c9 q6 l
8 [% j6 C+ A' _1 ^1 f1 ?; |stmt.Close()
3 T# X% }8 P0 q) ^
. P0 P* E' A& Q* y- _/ h}6 Y+ R7 C3 H, ^5 i: n1 B0 \. }, Y
7 A, D' c& i+ u) b/ F% |" k
二、数据查询 - SELECT
1 [ Y c( [7 r! i5 r, |
8 I: k: D0 w) { q- r2.1 : DLang 查询数据) ]: u l0 W* c: E
4 S* U4 c5 u5 U. h
import std.stdio;- V T2 w b% V: _# V! N
5 S$ Y2 a* c9 M2 {, Q/ g n% Mimport hunt.database;; r4 Y) O/ a; r
/ Z6 X: D0 v& {" a. t
void main()
) B. W' P' T3 B8 X) f4 E
& Z \( N0 [' `0 C& n{' J4 E$ I6 `% m9 H" y* \
0 y3 z1 S6 t, uauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");2 O, l" `% g* n
( M; a& t0 K" d: n, f! [+ Pforeach(row; db.query("SELECT * FROM user LIMIT 10"))' R* Q2 m) v. Y) d/ Z
2 R4 ~9 Y6 n8 h% K. [ D& G1 e
{
; r+ o2 I) h% t" _" Q! D1 ^9 l! _' C' F- j- o
writeln(row["username"]);1 q' ~, b, J4 ?$ p0 ], A% W% p0 P
& R6 F3 \1 B/ M! A* b0 \5 |8 c}
S& [% l2 P4 I3 R! _+ P5 x3 A0 Q, [) u1 r$ l# f. P" J5 s
db.close();
0 I1 S6 A9 ~) H8 z* o- {4 p
1 p) d; W6 F! ]2 l}
7 a, J+ Q- r& h7 c2 s( p% D' N: P( u7 {
2.2 : Rust 查询数据8 M& i0 A7 Q: A9 h& L
4 D2 t4 M2 p2 Y8 Z! S" l
extern crate postgres;
; P" L( p) g% _& d( r1 A; J9 r- i8 S, @- B4 w
use postgres::{Connection, SslMode};
2 L. J1 Q: c. d3 g" G/ X1 z! z/ [* d v
fn main() {
/ s/ u: u' j" c! {, d
9 m; m' L3 H: Z7 G+ r2 d+ {let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
, d) R0 _# x+ X _# R* G( Z. M1 b, e: ]- ~
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
6 p! w$ w" G! M1 L
5 l7 r( Q ^/ e% R' ?5 Pprintln!("Found person {}", row.get(0));
. d$ I* n- m$ R, D9 G% l3 p1 ]5 C3 u- t" P5 ?
}
) |& k& B, c" i% _& w
/ v# j( t, u; I) J% P}
! h8 k' ?9 h- _
* _7 ]# i3 c* O5 r8 H" l2.3 : Golang 查询数据
6 ]% b# d N6 L1 P7 ?* D1 W# U( c# [$ b" ~. K$ Z
import (
2 q4 D" v9 f1 i# w$ u- `( }& q9 @
"database/sql"
/ V4 |# ~8 }/ k1 \* N( t! X) G8 K0 U1 |
"fmt"0 e2 }9 g& e# [; y0 l
4 b! T1 O( Z8 k2 R- g_ "github.com/lib/pq"
W8 T( z( ]0 x$ ^7 c; W! b* @; v; \* h. v
"time"
3 i& i+ c0 S) z6 ?% W% W$ @0 A, Q+ z+ Z4 p
"log"
+ ~6 y" L% t* L2 W0 o/ p9 U) Q/ p( w8 T N% S* H& x h# d
)
. ]& ^+ O2 q( ` k" w5 k3 ?: H3 ? E0 F: q
type User struct {
7 [8 s, n( W) Q) L0 B" V6 G6 h4 I3 C$ m" w& }/ Z! r4 ~2 l4 u R6 R
UserName string" p K5 z$ {/ w. ]# s9 e+ ^9 w& Z+ v
) O' s+ N1 v$ K( C' g2 U4 _}
' _2 l1 }8 O- u: k f7 M2 [8 j' }8 v1 I+ {3 J" V, W- i
func main() {+ D! P5 v- P. Q8 f. W7 X+ F
* M7 v; y! j+ e# ]: y2 ~
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"). L+ j* c0 |" m# i4 V
( R$ D& O; f$ @' Z
if err != nil {
* L4 |% M. P6 _" E' U" I5 \/ K8 s6 h( ~
log.Fatal(err)- @: |. i% F$ l6 Y5 h
: r: f' G, G) C2 ureturn nil
" j$ `+ T; ^ x
3 T# Z* t( L3 w}
) P% [& ^1 T3 X: F7 r$ g3 L- g6 R
0 a- ^* l2 N5 H9 G! K5 ouser := User{}
( R0 [; G: F8 _$ \% R. M! }3 F8 K# z# v, H9 ]0 j6 C
stmt := db.Query("SELECT * FROM user"). c$ o2 k9 K: N! C0 o
7 f4 W9 b8 G- v. \for rows.Next() {
! L" g% q% d+ c) [6 B$ {1 E, F5 S8 u- h/ G5 w# N. ?+ N
rows.Scan(&user.UserName)
8 C' A, {+ r1 D) N" Q& K O9 z, y( p) K, E% D; d
fmt.Println(user.UserName)
( p* o9 f0 M) g4 L+ B- k/ {2 ^0 b2 |/ Q3 G/ t3 u; t
}
% g; l, D1 T9 K8 p6 y
( i# h/ v# Z3 ?7 J; C! ^4 V+ {stmt.Close()3 n u( H, U4 @- a2 d, M! x( A2 O
4 e, @- D+ [! ~% q; ^4 {
}
* J5 c: V T- N7 b) @
) s/ D3 d) q, m三、总结
0 f( C) C1 B6 L, j: y- J5 H8 W) `) [# l+ X: A
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
$ q8 K& L, G/ C3 }* N/ e- J r# M& W: ^
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好). g0 f4 N7 ^# ?; O
" h. K8 m$ s @; @& c2 {% Y在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。- d/ Q) s! K U) [* f
; y+ i9 x; ]8 Z0 C: s7 V2 m. d总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
4 S# ^! d! g9 T, W* Z, `————————————————
X) V0 b5 Q* J% m; M版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ Q* J# Y% e+ O5 _# W+ {
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961# B5 v0 z* q1 a) Z
4 v- Z: u7 H Y* i+ A
|
|