管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
2 b0 [) ^# m l# _7 v& F0 `* ~7 i2 i; `
一、数据插入 - INSERT, B5 v; F4 C7 l1 n! l# K6 W1 I
* M1 Q- G$ D, G4 g4 f
1.1 : DLang 插入数据6 j, o5 O- s/ x1 g" l0 A* x
5 g7 y: @2 }: ~+ @import std.stdio;6 A3 `& Z4 L. J0 O& T
- K8 s T, f$ u% N
import hunt.database;! W3 X c3 [" p$ x4 Z/ {
3 u- d# B+ u5 ~, o3 q; K Z
void main()
' s. n' `& R; N( _% \5 R# v
; j9 S+ y7 A4 ?1 Q& S& p{
[) e% k3 @' ]2 }1 Y
8 F7 f- p( ~6 e* t. hauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");4 k J7 }, X- \
9 y7 A# }+ @; w) iint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
0 W4 X# u; I5 e& f& M" l/ ~
- ~2 K# x- h: K/ }* z// 打印插入数量
7 T; F' M6 \" M5 q6 M" G
9 _6 I5 G d# M' k( A6 Vwriteln(result);
: M5 | _! [2 I2 v/ g7 W. A; W/ W9 L2 R# ?3 w0 i
db.close();
0 F- \ _4 ^3 N" l2 l: Z
, O+ m$ K& y, Z! e}4 o5 \, Z& F/ q4 S; e
6 n) U+ X) V( i H/ @
1.2 : Rust 插入数据
! y& e4 P* ?0 d. ?/ G
5 e# {" p9 `) G% K( v+ U9 z. Lextern crate postgres;
. I9 u& s1 ?+ L1 z- r, t* b U
' h0 k% u; @4 S' X" T8 duse postgres::{Connection, SslMode};
9 _' g/ R: f2 h" @ U
. `, b, f0 D$ S' Cfn main() {
# _! [" J8 Z O, e/ j1 f5 k9 ~! R% \' A, i
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
1 x3 U- P, n' }/ l) R
( J: J! h5 N6 R. Rconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
' k0 J0 e1 A b1 H4 W+ l1 m0 B% {5 l' O4 a# J$ A" w$ E4 q
}
3 }6 z+ i/ m! a8 ?) ^* C1 v* k; k1 A" ~4 _" b5 ]+ ^
1.3 : Golang 插入数据
1 e" A. l6 K6 l" q; W! S/ p3 k- G r z! j& _% a
import (
% y+ s7 c& } r0 q$ V
* K3 S# P: V8 o/ M2 p3 y"database/sql"; m# t) L% s% Q! i; [6 A* l* |
, m" r3 f! L4 q2 g, B"fmt"
+ j" n) N8 [7 @0 }8 S' |$ M: n$ L1 J8 Z
_ "github.com/lib/pq"
# D. V* @3 ~3 I; S& I0 H, \# P3 K# C, q5 P
"time"0 X- N, b$ O' k
) |; |0 g) c8 n6 h* E% ?2 ^" \
"log"5 r2 F' v8 d0 p- _2 V# G" {
( ]2 R2 }$ n# r0 r' |
)9 C3 l: Y: o5 K' T' D: T+ u
3 N Q, G9 t2 H0 ?% H
func main() {
3 Y3 }7 y& u% j( W0 j U% r4 G" }& i& Z2 }2 o4 }, r$ Y
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")6 t" K8 c5 F, k" m3 S
- V# }( O* Z& [$ e$ @/ r) S2 U2 kif err != nil {
1 T+ y/ Z: I5 \) p3 |; R) I# X- i9 w' q1 s
log.Fatal(err)
2 c8 a8 k' p: d9 N1 e0 e2 e# Y( n$ U# D$ l$ c' v" g3 D5 o- ?! T. r8 p
return nil
8 n" A" T' t1 }
+ k0 N3 Y8 \) b0 z: u}+ g6 q3 P0 O. u5 v
% Z8 K; i. m* m- n ]stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")' o8 ^+ `, e) E9 X7 x: b
/ s5 c. d! g) U$ \, W8 |stmt.Exec()* T% s5 m. v; O* h( P( @0 T' U
2 S% {) }3 X2 y3 J
stmt.Close()
( r; Y8 |$ i% n9 s9 W1 X' g4 e5 e5 G
}/ F o' q( k/ k$ }( o
2 p' y! ]1 ?/ [% r9 m" L( x二、数据查询 - SELECT7 m/ N) `) A! w2 o6 r5 R
: B, N! Q* l& r) _3 T; y' V& ^2.1 : DLang 查询数据- g# k+ i/ }' G8 @+ E
! p- n$ a8 a! _# k& P5 U
import std.stdio;& o8 b3 s J! {5 {$ ^: r
& G. J! w' }9 @2 ^2 Z' V8 iimport hunt.database;8 d9 T7 \6 p6 J) o
+ `7 q# g5 `. D# E. k- O- ivoid main()$ l* ?0 U& A& X6 n$ l
Y4 @- z% o8 j, A9 x( l8 m: a{
: u& ^) i' T4 d$ b+ h- D3 Q/ L0 C8 e# y8 `* n* p
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
; R2 u% D. @7 B* M2 B* a7 ]! f/ b# }' o* K* P
foreach(row; db.query("SELECT * FROM user LIMIT 10"))- w" U% i/ d; ^/ @* Z
\5 s. L) U8 V8 J{
: n2 R& Z$ R. O- M+ }0 u9 h+ [' Q ]9 d) u5 @
writeln(row["username"]);* t. N0 I, Q8 S; Q" u* m" `8 o
. K6 v6 a# N9 p) o}
) I8 @9 _6 ~: h- J, z1 _& v; [* [2 G
: v& o! v b6 e2 W/ Gdb.close();. {: a V( _: |4 \! P/ o
! Y. W6 t, e3 E! r8 `& S! X0 G! N
}$ h- r. i y, T8 {1 a
5 L! ~; }" `3 a$ \3 g6 a% f
2.2 : Rust 查询数据
" ]% t7 X; k" N! l2 G3 k2 T4 N" E9 `* z! n& k5 d# D& Z( M
extern crate postgres;
" P4 k8 M+ J& Q6 J' C" j. n
+ ~& P+ Q2 }+ M( ]9 h" {" |1 X/ Yuse postgres::{Connection, SslMode};
- \8 h5 Y& [4 |* d8 G$ _6 z7 |, N3 m
fn main() {
3 {4 q. N. ?( ?. \0 g) f9 `
* V- _, f6 z8 N. M0 j" E9 @* slet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
`; [2 P( w& n# s
- e6 y" a- C1 i9 [% ] r+ u4 `for row in &conn.query("SELECT * FROM user", &[]).unwrap();. l O4 w, }9 z9 J( N* K6 A p
+ J$ w0 O$ x: q
println!("Found person {}", row.get(0));
( @1 e- U6 @0 C3 D1 C8 P5 A
8 s2 ?7 n- H# Y8 ^: Y}7 U3 {' D& r9 K; J* Y' c' r
# J: v% E" E! @$ W. V
}0 G5 p5 F0 r6 K! U
' h' U* W w0 r4 f* i+ p& C2.3 : Golang 查询数据
5 z) l( m8 B- J' V& m- Z* }0 U) I8 w9 z% B/ N; ^ U
import (8 B- |2 U6 V: N4 I4 r
( _: G1 t7 j t m2 ~8 j3 i3 `& i
"database/sql"% H. H& X# y; a
5 J1 s7 q7 M+ q/ J! j5 O( @) L" x
"fmt"! l/ f1 |8 s( J& {( n6 Q1 m
& r/ }1 |3 V; W# q W/ R& |. b& c_ "github.com/lib/pq" V7 g7 h8 S4 G" s
: O9 V/ z& F( @+ e
"time"8 P5 _ e' r9 h* `- r4 P7 K
) r7 N( Y. c; X9 a# L* G1 A) v8 ^
"log"
( C" N9 d$ }7 T& n2 g; P
8 [5 v% U6 c; t# C/ _# X. n% W- t)
' C" _$ p; h1 m' c, Q
! g) v$ |5 \) m" l8 j' d' u0 Ltype User struct {" o4 `4 \4 l h+ T- g# n
6 U1 D" u, @; k; f& [! `0 A. D. R
UserName string* p8 y, [# @/ x$ R
1 S4 E- q, \5 `8 Q! o x}! [5 o1 q$ I2 t6 ^, |( `
. g" i9 Q1 ]( R
func main() { f/ _) s! h+ Y$ H8 [
" A/ u, I4 H( {, r3 n( x. Adb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
1 {; s% f3 p+ P- A+ ~8 @! R. N; V9 B& c/ y) `2 S1 S+ s
if err != nil {/ ?' |' l$ | r
8 O" Y1 g, M }& ^$ dlog.Fatal(err)- X- \, c2 e- C2 D
: g8 G( h7 R; W0 n* `- a; l
return nil9 _. a) r7 p2 W$ R; p
6 R: D1 K7 U5 i3 O}& R6 G* l, I* v
" B# m* s& Y: ~# u, e# yuser := User{}
4 |3 R) u5 P: |: A2 O5 ]* k0 P) N+ b7 z7 d% j
stmt := db.Query("SELECT * FROM user")
/ N4 H5 H3 I$ [' W6 D0 C1 I& Z& B
- @* H2 {! J4 P2 X# B" G# ?% rfor rows.Next() {% G0 [2 @# l# N4 L$ e& U( \
" a8 ]9 a$ W: J& k0 `% d( l! brows.Scan(&user.UserName)
- m/ _& R( d, h( Y: E2 N) a; f3 }4 Q- h/ S
fmt.Println(user.UserName)
! m! f8 g3 r1 x, m. q+ \5 F# U2 y& A5 B( J5 Q
}
( }, Z6 l) v0 ^3 M! y; z& s/ k" }, M6 C+ V" G, ~$ n
stmt.Close()
' x1 n% P, C9 B2 u9 c; H( u0 q* Z7 i( d' C7 v8 Q" f; A F
}" U6 S1 G9 P+ S+ J
3 e# t/ H$ Q; W0 o三、总结
* Q/ O, z. c- j9 A3 Y! d3 ^' |% E5 F+ ?" M* c4 `
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
- ?1 z/ R) j/ {& Z4 a G3 O2 v$ n# h- Q ~
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)3 f* y- `5 b6 K) f
( j0 J% C1 T: K0 B" A y& s! T
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。; b& E8 M% I, G3 o
) Y0 W) K1 r: t总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
$ g& l5 A! L6 ]" `( m————————————————
, D& \9 B0 e1 Q- }版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" q) t# r: R- [8 m5 H, U
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961; ^4 [0 v, w1 {6 M
# A9 F) v1 |9 u" [( e* H |
|