管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。; \3 M9 Q( l6 C2 K/ K# w% x
4 \- K( z2 W Q0 J
一、数据插入 - INSERT
! ^* |6 X$ H( @- G+ Q8 p+ X
# R* g7 T# V* q) F/ d# ~7 M+ Y. [1.1 : DLang 插入数据
/ b% [7 T. U3 l" m1 r, n. @+ E: N
7 P) L' e* P" |* jimport std.stdio;' _6 k: L% Z, Y
% N) {4 I; q7 m4 Iimport hunt.database;
, [3 s2 C. ?& P7 ^0 Q! s' k2 x# U" u1 A+ ?( D0 B' m& ]
void main()" \. q) o8 A0 V+ i
7 P# N/ e9 {6 W+ e
{
Q5 Y' C1 U, A# X
0 M, a S3 v( o' O9 h( Bauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
7 X/ @' D" k) E
/ @7 o+ I7 \! O/ i! ?% C, [int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
0 H' w0 X0 f* [/ M9 q& O$ m) J4 M, |3 b* C* Q
// 打印插入数量* t/ B5 o* U S
' X* P" F' F* h" R
writeln(result);4 a$ @/ t7 u' t ~! r
& n: H" ?% p2 H- U+ E
db.close();+ M$ ]" U8 w1 @& k8 S% q
h3 V9 M, I* S: Z' X# M7 n( H}
4 A" [# k! k0 K5 m; g; A( y9 h) x+ P. P1 c" t0 a1 C/ u; l% f
1.2 : Rust 插入数据1 W- W$ ^0 r( b6 H4 S+ H4 b5 O/ y
; {% n+ a% _/ B3 o! A6 C0 B5 z. d
extern crate postgres;
5 I: J6 m2 z4 _0 Z1 p& W" M4 B, H1 _: _1 E# H/ d/ v, I; D
use postgres::{Connection, SslMode};: Z! J; P0 k$ n) r$ Y$ V
' _. }: o R, {9 d# dfn main() { [- h$ l( F# U. f: o- A( k0 f0 c
0 J8 c& W, i- t
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ ]! @! _0 y3 Y; C$ k: g7 I3 ^ O
+ p6 q2 G* d* p( kconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();+ z+ I5 d' n n! I+ ~& l8 M" c8 M9 P
% l7 Y5 K0 r) [1 e}3 x9 w: m; H/ h
" W% n# M; i% O( y5 K3 K& ~9 c0 b
1.3 : Golang 插入数据
! i5 v! M5 ?; c$ \, [1 J" c1 r( h/ R, T% E1 t
import (
/ D9 G% |% O B* b: t6 y4 w% o0 r
" D; R T) g9 a3 _% r8 T"database/sql"$ C- y$ r! x2 N, T: V+ G1 E+ S% k
/ X8 H3 C; n# P' W. {8 B0 l
"fmt"0 R3 ?- e, N& Q
9 G) d' I8 K9 c5 Y# [
_ "github.com/lib/pq"* B8 `1 w2 }& G7 k' S# |
/ ~, N9 j o6 Z5 u2 a
"time"
- V% e' {+ k" e
: {$ ~8 _8 j5 \! J& X/ t9 Q"log"
2 n: _1 @, c7 q' b& R( J) u
: M0 g; C' K' w0 N3 J)& ~: R8 P! \( U% ^8 C2 ?6 D6 k t/ v
6 V# u" A4 C1 p0 |' r, ^: T
func main() {# z9 O/ L: U1 E' R/ o: A: a
( M& h" N9 D8 h$ r' f
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
; o0 z+ R0 c$ |4 R' J8 S% a, {( o3 C5 Y& g8 ?* U t
if err != nil {8 G' R% Z+ E, d7 y- @% S
" o) f. I' X9 k( X: ~5 ~/ _# t0 u# vlog.Fatal(err)
/ f4 I% ~/ P) }. E+ W/ S( G' b7 g3 h$ G! B3 O
return nil8 K6 H$ v1 |! Y* w' v
% i) n2 V, K8 j' x6 Q& u" v6 A}
$ A. q' c' E) i1 v2 j1 G
y& m2 {" Z7 i2 Tstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")2 c2 }: w5 q0 C' m! ~4 K
* p9 K. i: l5 o5 q% Z) i( e$ T
stmt.Exec()- i n2 V8 \) V* U1 b2 Q% S ?
+ P' o& A. n" L! _* h9 S+ c& T+ \5 Gstmt.Close()
, { F0 x4 e+ n! v( s' [1 c
# [6 {% _( @% w2 d}% H9 X H, ]9 `8 ?' L4 z
- ^! Q7 u2 E) }/ k* c
二、数据查询 - SELECT
5 c( [1 m% Z5 l0 U+ W4 n8 v! x6 c! {1 J8 B# H/ d, A
2.1 : DLang 查询数据$ p: W3 b# ]" ]- Y$ g) Z
a/ F1 z" G! i3 Y) g, r
import std.stdio;
4 _4 h! t+ H9 z: K8 R( m3 B- B/ N+ B% d/ n9 [
import hunt.database;
: ]9 m, O( H) o; o
4 _5 Z* i$ L# `) w! Y2 j$ s$ R; Lvoid main()3 i O8 P, N4 k
* Q1 _' E$ j @8 X( T1 B
{$ z. q. ]2 g( J# q
$ m( {* h8 V- i. f6 f
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
; `2 R# \* w9 z( s S
6 v0 ^. O, ~ q/ ?. Lforeach(row; db.query("SELECT * FROM user LIMIT 10"))
! L4 P, L& n- ]6 j% X
0 b, H# _; M. x( ]{# C7 q3 [4 l5 G+ }1 }
) j7 Q6 j' g, b+ U
writeln(row["username"]);
( C1 r: I2 \, _# p: R3 w& E; l7 a) M9 e8 L0 z9 f
}
( Z% x3 }# R+ `6 R2 t, B
2 T4 H4 d. m% T$ rdb.close();
. n' j5 t5 B5 L+ ?6 l, f* r8 {7 e9 [ M6 f6 o6 u
}" _0 j, g# ~) R7 K1 \! p4 y
' {9 a' e1 a7 ~9 U# u8 e6 g
2.2 : Rust 查询数据' e8 R! |# P: y# D1 E5 L& K
n, h" s! W, a; h: F
extern crate postgres;2 D4 Q% C1 h; ?. R# C* _
7 F0 S( e$ m$ R2 Y ]# c) n7 B- ^use postgres::{Connection, SslMode};9 m+ \2 `# X/ p4 Z' ]
& k* g$ j- u( ~/ Tfn main() {; D3 R5 Q E3 L
; l1 F* e8 {# F0 ^2 T* elet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();/ ^, _) X3 d' t/ [
- m0 N7 q9 S/ q" e" K
for row in &conn.query("SELECT * FROM user", &[]).unwrap();. v4 S1 E. T: m) v" B8 y8 a
( H+ x/ r: {; ]2 X, d
println!("Found person {}", row.get(0));
: ?0 B- W V- U# U- B4 c U% g( x4 n. R7 H# n+ i( o$ h
}
0 @5 x. y. C( l# {" I' J5 r j+ f* E; z9 _
}
B0 C- p9 t# N" D9 S H. t. b: B$ l: T9 ^1 x E% s
2.3 : Golang 查询数据
- r* O, @4 k. f& o! Q4 c& e( p* V: U" R H: L0 C0 C/ t
import (
" }5 @1 c5 j* W/ g# Q/ T% g) y ^3 z4 [* q
"database/sql"
+ G. T! P W9 N, o
9 e8 C' X# A% n: h4 o0 L- ["fmt"
6 [; L- \0 z, f o$ G2 [0 K- f, l- k; n: ^& Q
_ "github.com/lib/pq", D+ A0 D) ~3 n( ?5 ]& @ L
/ \3 w5 T% H) B8 E; R1 I/ k; S"time"6 }0 V) D; L0 N4 d: m$ z- |+ O5 f1 S
: ]% i$ z! Z# J' @"log"
3 [7 P* `0 Z# B$ c" a4 U8 Z' \2 d% D, o7 N# n. n9 H
)
5 {1 H& v3 b) D* {3 u) w9 y/ v$ s, F* X
type User struct {. u; B7 Q* j$ }7 g. H
K% e# M: I$ f8 @& K' E% A/ L$ YUserName string6 Q; i. _: r `& ~
' D" ~! H0 ^9 c; d( H* t) G x) {" Q3 L
}6 x' A- K) S" U& X
! {7 H& N9 G' ~4 f& ?1 ifunc main() {
' V9 _: I% d$ k& @, i! B- t* v: n4 Q5 l- A9 u$ ^0 k
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
( E8 D; k; m, U! t; g5 ]) \* t2 m
6 v0 T' S, L/ y2 V& X Q6 C/ hif err != nil {
: I/ O: L& _* X8 w% k+ |( q* ~: _5 U, r7 Y0 h1 n: Z
log.Fatal(err)
6 T) T' f# _( \# R
3 \! q/ R: w/ H4 c8 J3 r3 Zreturn nil
# X5 u+ Q$ k! p: e- c& n
$ W7 O9 P1 ~) Z* L8 g+ h, _}3 ?7 y/ L- z3 \0 E- O
. b' x% Q. y. V f. {4 O
user := User{}
; ~8 B5 S4 B N! Q' J* h. F" f" j4 U5 } ~0 G* q; X- X
stmt := db.Query("SELECT * FROM user")
* i3 |3 b9 X; {8 q2 s6 w% |/ x% `0 O7 \) h& I$ m
for rows.Next() {
' l/ O8 e4 ~4 R
7 C* ?( W! i) ]( C* t+ nrows.Scan(&user.UserName)5 W# ]9 i' \, C
) T$ i X8 m7 q7 x A/ Y9 Tfmt.Println(user.UserName)5 t, c$ j" Q1 N4 i3 L6 }
' W+ l+ O, \2 n t# O( B% U0 A8 X
}0 K O. L2 y1 H6 M0 a+ F
9 u5 n! O" J' |, {stmt.Close()3 T# }5 R, a' q, |- E n/ i/ u
+ Z, |+ A3 b$ p- O4 [}
: F9 q4 l0 z/ Q) `
; h; O8 M2 O+ Y& ^4 S7 L# S0 @三、总结
9 d- h# p" m( I6 P. P* T, q. `( W, `) V6 |: [. `; ^
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。4 A% y; e! F% q9 w
# P. v3 H, L( G# ]4 l
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)+ Y- s- m5 t3 k8 U6 ] z
' m+ ^. X& r, [8 l5 ?" f8 A I
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。$ s& \9 d8 U/ h- b1 u5 Z
6 Y" M2 Q& h5 R总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。1 a& }4 g, l* u& b2 t
————————————————, F5 }" U% L+ Z: D. p, s
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: w/ E8 ?( U9 |6 c! a- Z* h
原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339610 F% j8 Z8 {# q
- M, E, c# I% s K0 g9 \ _
|
|