管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。: V6 B( o8 H' J6 b
. `' M- `- O5 ^- K0 l3 Y
一、数据插入 - INSERT* v4 F8 z) d; w/ o0 _' H
- m2 B/ Z# N3 K
1.1 : DLang 插入数据% d! M5 n7 S' D0 a5 x8 A+ ?
2 ]: Q% c+ p# K( V+ h
import std.stdio;
5 i4 j" J, T. }- ]$ o$ w
$ I- N3 t" A w* W8 Pimport hunt.database;
/ I: ^3 N. P0 ?- V. h% K, N" f0 }+ |* Q0 s
void main() k, f, w) ^; t9 \/ l/ ~+ m
" S( {! g1 ?" h% ^{
+ ^/ ]+ G1 f( @" A1 d1 o. @$ W; {! [
' M, g8 v- h' D9 W" ~- xauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");' v& m2 S7 q$ ]8 A
, D9 w6 g7 |! Nint result = db.execute(`INSERT INTO user(username) VALUES("test")`);4 g$ \. Q2 \$ M) U7 q
u' T9 y- K% P, A: b
// 打印插入数量
9 j7 }2 M8 g0 A% W* ]) p- v9 \7 b1 ^# k; k- }1 z8 F; z
writeln(result);
3 k" w" @( F* l# Z$ P& Q7 b* u! q- O0 B% _1 U B4 Y; c" ?2 J
db.close();) a: [& S' X0 d4 w
& G2 K, f# f5 b
}
7 P5 `: p3 S l( [' {6 K4 k7 W3 `- r8 a \
1.2 : Rust 插入数据
" p% B0 H8 O8 e& N( f( c8 n( F5 d) A9 u# {
extern crate postgres;
- R3 k1 u% M2 w% {; M9 c9 _
7 q: H7 G1 D2 {6 puse postgres::{Connection, SslMode};
# m. d1 A7 _6 d$ R4 \9 |3 Y) p) J: k
( t& H( L- r7 [fn main() {
; Q/ v; x1 p6 X, Z( {0 _
8 F# g M& J. t9 ulet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();, M+ w6 H; e T1 {
6 U- D: q" F. N- L, j* M, q# L
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();: Q9 W* i8 {9 ?+ J3 T
1 F% Z: j1 H% e9 T' ~' S3 ]}
' [$ M" c, N' t! {; N% \2 a8 z8 U& u) ]6 A
1.3 : Golang 插入数据
& k |& s; z6 I$ q; m( _( j* e# ]
* O( U. t8 H. c. I" ]import (
7 o- {- W/ c+ V. k0 M! R
( Z% |! B, _7 B/ [' f4 Z"database/sql"
' @3 n) h. O4 d* V8 x) N6 m3 Y% H$ \
: R7 }- n0 A! c8 Q"fmt"
5 n) f9 H+ h0 z8 p7 s
: o& v4 G+ y' i3 N# ?4 f_ "github.com/lib/pq"
; _/ J, E) ?/ y
2 q) f7 t. D9 i; d" y"time"% d6 S7 U9 i3 D: Q7 H5 U
( ]9 o5 z5 B0 W1 k+ t' Y! {"log"
1 `/ P2 v! P0 T6 d
, o+ V9 |9 h/ N6 `' n1 J' r); f+ m2 q( M, w1 j4 j! a7 n! A
+ Z: C' j% y0 G: q8 @func main() {1 H9 O/ |2 k9 c" I* {1 x/ u
' Q' n, B4 i( z1 c( T) A
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
6 A! G6 s2 t- E" ~! F% ?( d: T
% d) \! E5 z# @4 [, w& ]if err != nil {
2 F* l. t8 E3 A( A
& [& L1 T! r) R% W& }0 Dlog.Fatal(err)
5 K) A* v. n( Y- c
9 F( h% U9 J$ _5 J- L9 d& freturn nil
! s5 v, W/ P6 N4 x/ [8 n* u( {4 _
' F( K2 C% y7 ~- n}
4 X0 V& t1 i9 ]( B y9 X- z- G u$ N' e9 W6 |8 o. E$ n
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
1 T9 L$ _6 R/ Q4 Y3 `+ v. p7 `* ]$ M9 T
stmt.Exec()2 |' \& [1 ^" N
2 R2 n, o6 I% d! @' K* Z% \
stmt.Close() q3 ?. n, \% e' V4 _$ W
& r7 N$ q4 u, \' ?}9 l& }0 @1 T/ [# `2 u9 v7 k
+ N% ]" t, B8 t$ D5 x8 f* V' n) A$ F二、数据查询 - SELECT
# B \0 I/ _/ g4 R2 x% e% ^; r
' A; K; m6 x3 T; U+ W6 K5 n: V2.1 : DLang 查询数据
" i; ?& Q2 ]3 S3 [$ |9 k& l5 B$ l
. T2 n9 w: M! P8 h$ \import std.stdio;
6 D. l; q I4 G
* i, J9 g! G" q) }/ s/ j2 ^import hunt.database;
" L( I$ V/ l. O6 ?5 }9 M1 f& `4 o: c* C9 g6 z
void main()3 {( j! W: B0 \; \# q* C" Q# z
& i1 d' f. P, [+ ~
{
4 U7 O7 e f+ w1 U9 Y# G0 U C3 } y' P1 {0 ?2 G3 n; V
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");8 l: E* k3 V2 o! x$ M
! Y* U9 I- S( o5 l: \% X7 E% Q8 A
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
f6 [/ O0 P8 t- o' ^& q2 [- T% c2 E% X0 O# y* a9 y% H
{0 N; X& k) f0 m# o# p- n
5 Z8 p, H- k S* iwriteln(row["username"]);
, V9 k# n) `9 R9 r2 t6 X6 Q! L( l' R
$ f" Y1 }- j4 L$ m4 }: j1 D+ i} r' R% E# X8 ]) h
* N# `$ s' f/ w. M) K7 `9 n5 k( idb.close();
7 _ l# s+ [* L
& V0 w4 n- J: _6 E, \. r}+ N7 x; O( j J3 p, X3 K
: b% t5 s( Z. ]' J+ o2.2 : Rust 查询数据( {' B2 S0 l4 ~
$ {# \) W0 L! s7 vextern crate postgres;
& Y( O6 m, S+ \( w: P) Y
6 x7 d6 S p, R# q9 y9 R( Zuse postgres::{Connection, SslMode};, W7 \6 V0 G' G) M9 X3 H6 T9 q. G. B
1 i/ N% f7 v; {/ g: q3 P* |% _2 R% Ifn main() {! j: r4 U2 T0 x& U% ^" M1 y6 F
, N* }. w _1 N" M
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();9 D, d; [) v% {, X
: V. H) m8 s/ K5 k0 W4 I
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
# ?. J Z' C5 T8 t; I- H
& b7 R+ |) K* X: V9 C4 r6 zprintln!("Found person {}", row.get(0));# h( O; j1 j' w
$ \; \! {0 E7 d' l8 K9 V
}
3 K3 z: a( b) i2 I( f1 v" z4 p5 I$ U% w5 c/ e" v. ?
}: c9 A: A0 \5 a: E+ y: `4 }, R$ j
, f& w) H, {# w! M" P W7 u2.3 : Golang 查询数据1 h! I% N5 u5 c6 O0 _0 a* y, a
2 {; W4 b+ `& P& W3 Qimport (: h8 [8 [/ _1 N- s8 z p/ N
- i1 i: {" _) N9 X7 M"database/sql"
" C8 }- b" C* K4 o7 c& {: u' G1 a. O: A: ~$ ]3 i
"fmt"; J! P( ^! s1 c/ ~' _! Z
o2 d6 b) n8 l# o6 x8 H
_ "github.com/lib/pq"0 [" _9 f1 P- p; m c
2 T7 z9 P$ ]4 ? }" G3 t3 [" g"time"
, d" q( [3 n( D" P4 b3 Y! {4 B" l" {% X
"log"
% `# v/ J n, ], X* s" F# `+ ]+ ?, g1 o& H; Q; |# n# t5 x
)
: I+ [* _ V o: z7 E! x/ w, ]* r' t% g- j
type User struct {+ M0 U7 E1 B H9 h, j# _: ^
U, p) R1 W3 D0 z8 @- G; @UserName string% |- l4 ]4 n' u+ N) B
1 l' F) B, |. _
}
W1 C" m) t* E: x9 A5 ?
" k! z6 c$ z, Y) i, ofunc main() {
0 B: w6 x8 a$ c% E- K; A* M5 z
$ W' x2 c g" l7 [; X g" ]+ rdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
2 ?& t, e7 Y3 _ P, N r/ w2 N; y3 R2 T2 e! n" x
if err != nil {1 I3 _$ D( m6 b/ Y/ v7 q
& ~7 e# h& O) R" [7 Jlog.Fatal(err)
7 n/ h( k( X. C$ j1 W
7 |+ |" q: ]2 C0 D9 Kreturn nil0 Y' }1 A1 Q; F) [8 V+ [6 r
# R* g/ ]) F$ G+ _( K r
}
& e) w" u1 k. }7 U& n: m9 E) Y7 D- l. W8 J
user := User{}
' M, h* C# q4 _: W/ R- q6 e9 K7 ^
stmt := db.Query("SELECT * FROM user")
3 ~: h0 U H% y) I: P
. @2 D2 T$ p. J9 F0 T: ^for rows.Next() {# B! K' P" X3 {* h
6 K6 c4 L, P# D, ?$ m) d5 W; A# erows.Scan(&user.UserName); ]# O) G% n6 \ g/ H
/ i4 c4 g) D# {9 |5 Z/ e9 n8 h4 B: ffmt.Println(user.UserName)/ L6 p* B8 ~, j. d' C/ q3 m
1 Z$ i4 C0 D0 `+ M
}
) `% E5 J1 i( Y2 h1 ~4 l- Z6 x. `9 [) U$ o0 n+ @: S) U
stmt.Close()( A7 ? O1 E# I8 i
% G) [( g" c- _: G
}
/ _8 Z- X6 n' }0 |9 ^ m8 [
& H+ l/ g$ A* H* |三、总结
7 z1 P1 G9 j, X, z2 B. k& }
% q, ~8 ]) o0 d' e3 H对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。% s+ T/ x) `9 W
$ Z7 k( D+ }/ V0 e0 V
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
, }( d P! x" Y8 ^1 q
1 ]' w- v: j9 p7 o在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。3 q$ n, V [. M. z# p" D
8 i& q5 b7 m3 f4 T总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
- E) W$ D8 K/ C, H————————————————
9 G3 D( s" }1 g5 E) o! t% q! Y8 w版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
w2 ]# A5 b! n4 P, N+ I原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
. `& \9 j4 j" q$ ~; K
2 C d8 i# n I/ P4 g! X |
|