管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
; H" o, s) x+ S( G& d0 E: z! i! S1 p+ K7 k! o/ [: @5 p V4 j
一、数据插入 - INSERT
' J* Z! y) b S9 \8 j* e; h/ q& v; M" X ]! Z7 F
1.1 : DLang 插入数据& W/ k$ \+ O3 o, F0 V d
) _, ?& {4 J, pimport std.stdio;
1 Q* ~, @# W q) |
2 R8 m- a L) [! W9 Himport hunt.database;$ q, ?( j" a- b5 e1 W
1 S" D" Q) Y+ B; A1 h. \void main() r X5 ]# x6 P. t) m' ]
- Q/ z' h# [' b% r
{
0 G# W' U4 \1 |8 L4 O/ z4 |& M" o- c1 d% B
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");- A) c- E9 V g
' Y* I8 C( f& O, l$ f! I+ s
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);+ r& S$ A7 j1 j
- T4 R* k. M" H6 x( z7 b
// 打印插入数量! e8 ]$ }7 r; ^8 g! E* _3 n
, B1 U! B0 P9 M' Uwriteln(result);5 R; x. }1 P3 [( _. k+ x. D
1 A6 g) v8 U G+ G- J7 w9 O7 c; Vdb.close();0 F6 f# S: ]; f: u- V
& |2 F$ |& l2 M
}3 C$ p9 J y3 h v9 S
6 E, l' Z9 a+ x5 ^1 D& Y
1.2 : Rust 插入数据; q% U1 ?8 k9 {" c; |
+ }2 Q, \5 u7 [" |& Hextern crate postgres;/ Q1 }) S& h2 X c- {2 ?
6 Q7 H* l' A% q' V5 _ r0 t& d
use postgres::{Connection, SslMode};1 |- q7 G5 s7 C. p" `; a) [0 Z
" i- j$ s4 }& \2 ~0 w9 d
fn main() {
2 |! M' K! T6 _5 J$ S/ f" }/ i
9 A- O# e+ F" l3 g" _* g+ \4 |let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ k0 M$ `$ o3 Y) L
w! W1 n5 m: D$ R; R. \) uconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();" q* D* Y5 [9 P4 j( Q
* G1 A! W( ~+ Y+ n$ U}1 k4 o$ K; w' f# {+ }' V
* }* K. y& T, ]5 J4 c& z
1.3 : Golang 插入数据5 b, B$ T% L3 m% O% ~# _
! @) h) H& B/ x6 U3 f
import (& v" `, R: U/ M; q" V( C& g+ h
4 E" _; e& n3 @- T! n# T& ?+ \
"database/sql"
# s3 Q, T& W( i$ U6 H/ d
( E9 L( e* l% O7 h: `% I"fmt"
+ V2 C0 v& L: R) W; I. k2 S3 @2 e0 C4 D8 G
_ "github.com/lib/pq"
: _7 [% v. ]- x! @' T2 ]8 [' J0 \" ?
"time"
% A6 {2 u9 L5 p* W3 ]5 a. d9 V/ u8 x2 Y1 w& X" I9 A' r5 x
"log"
2 d/ }, l' f6 O0 l, O3 P
+ t3 d$ q7 p- B( I/ n6 _; s' T1 ~)* ^2 C$ O: k+ U4 S- U8 I) x; Z
/ _( w9 p9 X/ L! n3 y) zfunc main() {! `! r# N8 ]: ~
3 A9 e' f* O9 ?. f& v, B+ k- y! Ddb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")! M& ^: {7 U4 z, f( `
" Y k. ~' B8 F7 u5 |0 @* S+ D: [if err != nil {1 M, S: z+ ? u6 H5 S( p8 }0 Y9 y9 e1 R
8 k2 X; s; Q) h5 y f8 g6 J# E
log.Fatal(err)/ b* o" B" Z/ V* \( r. @ g
) d/ u" U5 n9 J9 qreturn nil, @2 i! Z1 K6 b/ F
& Y* I* ~' h6 o* _}: _% ] L1 H9 m7 o6 V$ y
: {8 d- d5 X; Q( M/ s D4 J
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
, U$ L1 B$ {0 Z' ]1 |
2 Y4 _7 {5 G* s. |" Pstmt.Exec()3 Z* y+ M' t9 P# |. ^+ I* K1 a9 _
+ V I; j$ W' s" _) istmt.Close()" f/ \" c! j$ ?) s R
1 L7 ^! p" A' B0 x. S& D}0 R3 F: D) R8 g, B1 ~
6 {% s" {4 h! m' Z/ }) o二、数据查询 - SELECT
% G' f, ]( `7 W7 @8 b
/ `6 ]; o6 |! {2.1 : DLang 查询数据
* N- w& t* R8 `3 B* V [4 Q0 y* f; ^0 V$ i, y. q
import std.stdio;& c, p" _% W( T; Y0 s* ?) u8 f
/ j$ M2 b& o- z7 s; A0 b. p! e }
import hunt.database;& M' C' Q1 N3 p9 q* S; @
1 [2 F0 }' j# M& Mvoid main()
9 o: H; h6 F; } D8 n' _; a& k2 K5 N
{9 F& d; R0 n+ G0 n& Q2 R( j* P
6 G g5 D( y0 {
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
) p) Q6 C# ~3 M0 [. _1 I) o% s: f
1 M- g# e$ Y) e4 X- B$ G8 V% [foreach(row; db.query("SELECT * FROM user LIMIT 10"))+ ^! I8 V" ]& Y( t9 I
/ j, [" U0 D& O{( ~ E6 X- X4 K) x! T* K% ]) g
/ s6 R6 o( S% Y# t$ L
writeln(row["username"]);7 ^: K, n0 z( q% k) f' j
0 K5 p4 H; j* q5 w}, b! @/ d" F# \5 `& u9 s. c; H) \
1 n5 X# y, w: g# p: S! X* I D
db.close();# i: X3 X1 w, F& P) Q& x5 y
1 U+ k) x9 e5 r) g$ f% _' B
}
- E0 O% y, s4 Y8 c8 a6 E5 I$ }0 ^( V, y& M& i$ F6 }/ l
2.2 : Rust 查询数据4 t u7 T. Z3 v; W/ n3 ]* X
" B+ j& c" m6 S' ^ Jextern crate postgres;
2 F8 M* a/ a% Q; q) L. Y/ G& b0 H% @$ N2 X. Y: t
use postgres::{Connection, SslMode};
( j( @- G+ k4 `: k& J$ f v' n: Y8 S! y! m5 w
fn main() {
* q) d1 ^6 }& ~5 D
u4 o4 V/ x- x) P# blet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();5 J0 M$ @" D* @; ~* X0 m
N: M" M6 h0 C1 m0 l2 _1 c; tfor row in &conn.query("SELECT * FROM user", &[]).unwrap();" L/ l) O/ a% l( S7 m5 r
, Y: }) s' p0 e) s/ ?println!("Found person {}", row.get(0));8 L$ d% Y' [7 k2 F8 {. U0 K4 v
- z. u; I4 i4 |
}
! g6 D5 S' x0 p
/ |- p) n7 M4 e) E. t2 ]2 D3 n}
. O! t' H2 m- R
2 R1 P$ Y0 U) x0 C4 ]2.3 : Golang 查询数据
5 O* g/ K+ P/ i" u0 v- m7 k! V8 K8 J: R) o3 I5 B1 Z
import (3 B& u! Z5 t/ c( ^; l! q
1 M% J, l1 D0 N3 y. C7 I" t
"database/sql"
0 ]5 ], m. i" L) n$ e
, b( M, U; y/ V' w6 q"fmt"
- `( O, S) ?6 y' `8 U' P3 ^/ K9 h0 K
_ "github.com/lib/pq"6 `& R' J1 V! e8 ~8 p
3 b& W$ u! m* [# j" o
"time"" U( N( g& Z! C
- R" x% ^+ h0 n- h8 C( Q"log"; H8 l6 a* v: Z% m( ~0 J: x
# `; o# Q) ?. a( u, a4 })3 r- d3 o4 n; O2 x, Z
. r+ Q! I% j% R3 jtype User struct {
8 e" h1 Q4 B5 O, F4 h* p" C0 o: i+ V5 _! u; R
UserName string
! L8 l0 Y# f0 \% |1 g- ~* i) t# r1 F" u+ s& `
}
' n7 J5 p5 ]6 [) E, b8 M' |; a4 O4 c; m: e. v( f6 k
func main() {# `- ^$ u7 K0 e; K" P( p2 {! a
4 J! v! [# w i/ p* Ndb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")1 a. J9 \' C0 [4 y- K3 N, N
5 B' k) \! x9 ^! t: V8 E, eif err != nil {
% T* r( q' b# k( h: a, \9 e/ i1 ~2 ]0 ?& X3 _; x* ^0 z
log.Fatal(err)
% z( _( @0 I% L Z5 A' G1 q& V0 u1 _
return nil
* m6 S0 f* X0 h6 L# L
% X/ @8 m1 P+ Q z4 k}
2 G7 B8 E' l3 v4 X# X
, z/ B% b) ]* {/ k0 k0 I Nuser := User{} g/ _0 s# b+ T: w' i0 [& Z+ b
& j3 q/ v. n% Lstmt := db.Query("SELECT * FROM user")- w4 K0 G1 m- m2 W; ^2 U
( n8 _% R7 x5 d/ ?
for rows.Next() {( d$ j5 k2 `& E' H3 V8 [, x- a3 d
$ k6 m& `7 j: ]8 H; U/ [
rows.Scan(&user.UserName)
2 l( T& V# _0 _
; v/ s5 R1 ]/ Yfmt.Println(user.UserName)
+ t4 J6 H# j+ H8 z7 `9 c
: n$ j2 C3 a/ v: N8 b# a2 w6 I; `7 J" V0 R}( A# V; e& g" ` z0 K
& j h$ `& [8 R: t& u5 h; L% [stmt.Close()" V# W0 }: c8 w! G7 M# m9 ]4 Z
6 D' f. N/ w/ T8 d. j
}2 t1 k0 D! T& w+ M% H1 x. C
+ s/ F: ?( b2 ?0 R三、总结& {0 c6 D! |! i. A0 t
) G [$ O+ d* K+ S对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
- M# i; ?- O. [# o3 H. N
Q( f; k+ x y" B9 ^这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)4 D. O" X; q. P9 `( ^
! j( }( h, R! c4 k在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
% Y) g! W. y7 m' l$ Z# ^7 X' k! N6 b& w' Z- i
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
) t9 }- k6 \" O2 c+ j8 d! i* L————————————————
8 Y7 D# ^/ k, ^- _5 i版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* {# K- ]( ] _/ Z g: ?
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961! _7 _+ b$ }4 ]6 Q
- `- }( L3 c* ]$ d+ h8 c
|
|