管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
5 B- A: ]/ t6 o/ V+ N1 B% }& A! ~) Z. _* d5 S4 s, _( `2 R" g) Y
一、数据插入 - INSERT
" S* z' K! V {( n: }. l7 r: S: s/ @
1.1 : DLang 插入数据8 P* m9 i) M0 I$ R* A
$ q! G2 B- T8 O. Aimport std.stdio;
8 n" H( E) k: ]2 V& h- ]5 H
6 H, c, h8 d4 o) y* a7 }import hunt.database;" }3 I' @, X; p# t* h5 p) d Z
. Y8 k: O/ D9 s5 Ovoid main()
* q. Q) b0 y0 ]$ N
# C8 F9 X$ d* E3 x: t{9 B- d3 b) L) h9 D; a
0 F7 n7 \$ {0 u2 e) C8 A$ D& @
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
5 }/ C- ]3 f O4 A7 I
2 u1 G5 n! m% |; I; F( yint result = db.execute(`INSERT INTO user(username) VALUES("test")`);) p( T. q2 y2 D" h
: R v. O* h" Q2 ^( T" N// 打印插入数量
3 I" o8 f. p+ Z' ?6 @2 k8 G5 {, D' i# K( ~; e6 h6 e# q
writeln(result);! E% n8 ~* c9 ~3 I8 {0 B: n
0 H D6 b! @, c2 E/ Hdb.close();) h6 v4 B* O) `/ \! W( K3 X
; S$ |* [* z( M3 \9 C( d; l$ O2 R" D}
: F" \) I3 x( T
# f1 [% G* O& \' j( r1 `! T1.2 : Rust 插入数据9 H7 e+ a2 ]- J' a' ~ o7 S" N; A% s
$ d: h: F# Y% e+ Z4 @4 W+ `$ _extern crate postgres;. R# x+ Z# v9 d* f, E4 o
) ~( z% J2 o' ?/ `1 Y1 ~' Fuse postgres::{Connection, SslMode};
; L/ W" B7 q1 F1 @" X, _% s8 ]0 r1 Y1 \
fn main() {
8 ~9 R2 r# g7 u
. U9 F9 |" \ G& ]3 a7 Flet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
8 d, \( D0 E6 x- Z$ z4 H
+ e) K4 [% M" O1 g. J( n. e3 g3 \conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();2 R# \$ Q% G1 s8 _* G3 y$ ?3 L# @
* I+ X( B- {* Y |; T
}3 I, l' D2 d- u6 c, f& z
' {# y6 f; {" f) l! \8 T
1.3 : Golang 插入数据: k# Q/ u+ Q; s$ h8 B6 U# \* {( F
, r) {$ H% T0 A$ F1 s$ s3 ?4 |% c
import (
7 j* G: d7 B2 T x& D
* o" }; l4 ^+ Y3 F1 C9 L9 h7 _"database/sql"/ P& @1 q- b, G
# @( n( C3 n9 t2 n* O$ b"fmt": [$ S1 B' C7 q
q3 G6 e$ M9 v- l7 W( i
_ "github.com/lib/pq"; u- r4 U4 V0 d& D7 |' }9 g
. A- t* p! [9 I1 x
"time"0 w3 ?" [) g. ~# W+ J" I
0 u- F8 }3 W! Q
"log"+ k O5 y* M$ Q. ?3 P' Z4 E
- `3 N' h/ w! d7 @)) u; S' p# j" n! I3 W, w0 `
p0 q) N; J( u. [3 ~: a. N
func main() {
+ m) X+ P0 ^! I# a2 H
# E3 u: L, B6 X) h. ?. edb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
5 }! @( _+ c* v, E" w5 o; c$ Y3 K3 {
if err != nil {
% P. @) w+ ?8 S( g( d- H# B
6 l4 E: i$ T+ n* p0 E6 B* P* B6 I# ?log.Fatal(err)
n6 t8 S7 X! @5 s
/ h I( l( _) [return nil. q- ?1 N. n/ { ?! H
" f6 e, A4 c3 t% {% L
}8 Q5 N& t9 v% C4 x/ d& {6 z2 t8 ~( Y
. `$ a1 x" Q3 v1 m' X4 T5 U4 jstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
9 m0 N8 E4 R# ~/ D- Q; m8 M5 i$ t$ k: O- f; A, X6 A
stmt.Exec(); d* J3 B7 A6 C2 n6 x
~3 V- V# g' e5 K v
stmt.Close()( u' ^& q2 v0 t4 L
: t* _ t1 M6 R. P
}
" d. S) ]6 _6 v0 D1 ?( \0 Z, X) T) i# B I
二、数据查询 - SELECT+ p3 y, ]2 @5 a$ Q! K5 t3 h+ }
) J8 l+ E2 _' \8 V% j( |: Y: W
2.1 : DLang 查询数据$ [9 P& h6 k7 r c$ M3 E/ ?
7 D9 R4 X- G0 f f8 ~import std.stdio;
. s' u( u) X) c+ C$ y4 h' u
* n1 X6 C$ l& B! Simport hunt.database;# _1 B6 w! F& G8 h2 P% ?
3 k# h; X% r# D7 m5 |, Y+ F4 q- o7 nvoid main()3 O5 T9 {; {0 y% `0 @
+ |7 R6 ]* v5 B( A# {{1 ~' R. s/ B7 @/ s z
! f* o/ P( R, A. ~
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");$ E9 ]! n, V! ?6 |$ T- K% r
. z& e! }6 I! V rforeach(row; db.query("SELECT * FROM user LIMIT 10"))& _& z3 n* U5 ^- t
R8 z! E* T. Q8 [ r& G8 W
{9 `* M# ] Z3 }! `' U' n( z/ A
/ I! Z, \; a6 P- Rwriteln(row["username"]);
6 c6 o1 D, K1 H0 Q( y0 P1 k8 h5 W) y/ n+ {! h" u& m
}
+ E8 f9 h2 A, E. V, \8 _; y6 b% G) }
db.close();- H! I9 z& n0 Y& b9 f# W' d1 k
5 Q7 {% c1 \9 ]- i) G/ Z1 K6 e2 w}5 l* A8 N- P8 c( o+ `
& L: O) _, }% j0 Q. `% A: A) ?
2.2 : Rust 查询数据
$ [$ O. [8 f( g7 V# ?+ f$ T, v+ M2 p& \$ D" u0 g. \! Y% ~
extern crate postgres;+ f2 { v" P! H( S. V+ Z+ Q
' f! n# F( D9 r `. z0 O' d# euse postgres::{Connection, SslMode};
" @% F; p# }$ `
! r0 |/ C2 B* [/ o. Lfn main() {
8 N& S7 G+ Y% q! L8 A6 @' J
8 S% C9 G3 R7 o. C3 w5 e# _% Xlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();4 R0 r( ~8 N' v; \7 w2 u
& S2 p& P6 G7 R6 S& H. T6 n
for row in &conn.query("SELECT * FROM user", &[]).unwrap();2 j2 f$ Z9 V! ^. H
8 j/ B. R8 z# J7 V7 N2 \) A, M+ @println!("Found person {}", row.get(0));" |3 z3 {5 f7 ^ n8 Q: k
' r5 X. s" U: w% s6 {. u}
4 |6 Z, P: ~0 D5 G: ]8 N. a6 V8 I5 l- u1 L, T! r$ v' q
}
* A% o8 ~/ U& I2 t" Y. Y3 \8 m: K# S1 o. k, h& D
2.3 : Golang 查询数据
# ^7 ^+ Y+ G( }
+ [$ a- z& {6 A; o& o9 g$ Rimport (
/ m G. n# P5 k6 z# E% O4 l1 a
8 `6 u7 i# D: w. `"database/sql"
/ r I) D1 c$ j
; L3 C9 `7 O* ^8 j"fmt"
. d& B- y1 Q T( k
; ]; ^2 e! Z9 H+ r& }4 I_ "github.com/lib/pq"7 u6 o3 u" `# n% U) W
' Q, R7 ]4 i, h: Z% R" i
"time"# y, v4 U+ j; Q- P; z6 ^
% [0 a* `# A2 F% R- \"log"3 }; I: a; L( }) n
# c/ F9 o n% E j) k0 J: k3 }
)
2 C: ^6 `$ y$ G
$ j; n, S4 I. C& |) D! ttype User struct {2 n" h) p/ T; M9 W l! k
+ \. f. b. r8 D' t$ T; e! G9 Y
UserName string; @3 B h- X+ P* V# b
6 O1 D% S8 d x8 j: X0 Y# e/ B
}
2 f+ z% ~. d/ ]7 r0 U2 Q
$ b1 S7 E c9 i$ A6 q0 qfunc main() {8 Y$ ^& x; L5 g
& v- ^& Y: H8 ]' {
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")1 U% @6 K2 O# `- i
3 P4 A4 s. K& G+ _/ A
if err != nil {
( L+ M" Y3 L T, R
4 Y* b! G! W! n# S- C" K3 F `0 j) W' elog.Fatal(err)6 H8 O* t2 L/ y: o% ~
% T7 g' K5 X& u. j& ~ U
return nil
: c% A) R: K# m% z5 K& r0 P
' w7 f2 H# ~ C+ X- C}) E9 Y+ P4 ]$ s4 p' H, j1 x
5 X% H+ h. d4 B! I- E4 j8 |user := User{}3 V2 T2 A. ^: t2 [% E% d
. w+ B* X9 s$ i3 V! L
stmt := db.Query("SELECT * FROM user")
2 R+ z. ?0 u2 ]1 L8 c/ G# V$ j4 y: i
for rows.Next() {5 s# }( [& M/ G4 r5 _
3 D/ \8 l% l8 o' J( X
rows.Scan(&user.UserName)
9 a0 r5 g' C9 T4 P1 E+ n- I! q/ T+ ?
fmt.Println(user.UserName)
/ k4 l4 h6 H$ a+ m) n, \8 D& k. K5 b3 c
}
# c& q- p# \' F/ _0 y$ Q
, ^$ W9 ?, U0 W+ Y8 ]stmt.Close()' z$ b& {; Y! G
/ Q9 V1 A7 ^/ j}
" [# \" r5 m! b k R8 P1 Y( g- M m7 x: q7 w8 s
三、总结
* D0 i2 a: p* e9 U V) f
; ^4 j+ i9 j, o! a! ?% |+ q; T对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。: ~3 c3 Q! t0 y+ U) y7 h' O
$ L( G* w6 \, E: E这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)! `4 Y4 F8 ?7 X1 x- S
; B0 ?- n5 N4 F; b在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。9 I* g- M7 k/ e3 }; O
7 G0 h! x; g5 l: x$ W! ~( C总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。4 Z6 Q5 ]/ ^6 m8 W7 M" ~
————————————————
2 s) }) `& \( o8 q, v X版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
4 l, ~4 z' ^& h3 N4 V7 x8 _; r原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
) V4 M' b6 a% p5 {3 Y4 t0 \4 @. X' |& s
|
|