管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
4 B7 A4 w, B9 m, _9 w R2 ?+ g
* c. U+ t6 m+ C' e2 B& E8 r一、数据插入 - INSERT
3 T% ^2 ]% a* l
9 n! A1 T- }; z. `1.1 : DLang 插入数据3 Y, Q# e7 ^& ?1 w- V" S! p
% [- j, r N3 Z+ }
import std.stdio;
5 i( M7 @" X7 n
9 C; H3 A9 [3 P% ]! a0 t B( pimport hunt.database;8 ~6 @! t1 k* I/ }; G4 C) C
) c* j- h/ M4 q! m7 v6 j. l }3 W& Evoid main()
2 u C; P. \- z, q1 G. V+ _, I; d5 w* ~
{
# r6 d$ h2 G5 F; t
& U! w1 t1 E! ]" }: J8 zauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
$ o) p# S$ l+ Y' c9 h$ i
: w ]2 Y, Z J; k; kint result = db.execute(`INSERT INTO user(username) VALUES("test")`);3 E% y( j N6 R7 Z) ?5 E5 ~ n/ f+ }
$ T0 n6 \# A6 t8 C
// 打印插入数量
" u& o( {; C! C/ |1 Z; J$ k" Z' P, c5 Z4 o2 O9 x6 R6 k* l% R
writeln(result);, i8 X/ Y! M+ o8 w
! m, d4 g2 a4 L0 _! V6 N
db.close();
* ?: Y; a( n% ?1 T7 m8 o& ]' U5 D2 _" }2 P/ {% C9 s
}
) m- j/ u9 w C% s& l. O2 W: O! X
1.2 : Rust 插入数据0 O5 e2 [; V W' Y
6 C. h; \1 a* b$ J; E8 Q" ^7 e6 b
extern crate postgres;; j" {& c- F' s! u& ?
3 G1 c& R1 k; W. _ J! Z7 P! Z
use postgres::{Connection, SslMode};( }6 g* v, U P4 K4 u/ h
* q9 T' {2 v T/ \% z0 ^fn main() {
* o9 Q1 r, v! }- ^ |) s- L
8 g4 q6 x/ A6 n* Y% Plet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 f. p5 R. k- j m' j9 F4 c" s: _8 N; q) x, f, ]
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();; \6 ^1 F* g( k
O' b9 e! @2 K+ d1 N+ Z, x& h; s9 g6 n}
" \+ Y9 _, l- t6 l, x/ J- i# k4 {
1.3 : Golang 插入数据
0 |: B. r3 v2 q2 ?) E$ X4 y9 I' v! F1 K9 X6 L# ^7 x2 j1 h
import (8 t$ P8 l7 S& u! D* W
$ v9 ^) `, G8 p* E3 J- h4 f/ }"database/sql"' m+ _# x/ j7 K& R
, e q+ l7 L& f1 R) s2 ["fmt"1 ]4 v6 R7 T; ^0 p
0 n( r5 @' h3 G o6 @1 V
_ "github.com/lib/pq"
# Z/ P) N' K: Y" r3 l0 J0 ?) L6 Q# j0 h) q' ?, ]* i$ @
"time"
. \3 e% W$ _7 ]: y/ P" n6 Y/ D/ E+ v% P# `1 }3 A |
"log"
# b/ a& Z5 ]3 z$ I" J" D8 C9 u0 ]+ u1 u: T3 M
)
9 \, x' K- k! o7 x/ g7 ^3 H6 l4 V% t3 N/ y) {3 Z `
func main() {
4 k, q$ a1 b' o$ C) \( h
1 T8 P: K c& M- T Z) @ G, h3 Edb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
7 U; S! f8 U1 G
8 w; ~3 u; N( T4 G1 X5 C& Kif err != nil { o# p( I9 x' g5 q7 Y& U
, \( Q" V4 ^4 a' V' Q _- vlog.Fatal(err)
8 Z$ g, w( I; p7 o- |3 i$ x, T1 R
6 I4 f& g* n' U0 @0 ureturn nil' k& z! z1 e+ L% D8 I. n4 W, ~# r
% G- k6 l) P2 v/ d% c; _}/ ~3 Z0 a7 r) I* z
{+ A/ E: c4 f, b9 x2 I% Lstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")" l' z6 z* v* |% r) x! Z
2 R+ Z9 F" V+ f) T. h8 J
stmt.Exec()
7 S, c( L+ M7 f( J, o
5 p4 n) N0 W5 `( `% |) Pstmt.Close(), z3 m' T! Z$ E$ ~
+ e7 g% [6 Y y6 Y}/ x S" t, K! f' {. X- I
8 d* p; P5 j' l- t# V
二、数据查询 - SELECT0 \* v7 I# _! [5 }& m& }
) W' h P F$ c+ E3 C* H6 m* l/ w" |0 H. i
2.1 : DLang 查询数据# ~5 }# l2 f. J
0 Y; B9 C) L. {) g2 @3 Fimport std.stdio;
: X) T* _' h6 r! \& B0 S+ G* G
/ M& v7 i% \# i7 ?6 u U9 L& s: j* Ximport hunt.database;9 G+ }& @" `0 F6 ` d: |) p/ Y
* Z2 p7 G/ X, h" E4 M# [
void main()
1 Z- P+ `5 M. d6 }! f1 V8 @
3 ?* L. P# C4 ~9 @{
' q+ [' I% I- D) ]9 w% y: ~
- q! `5 T+ ?" S8 G; ^auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");5 U+ U* ~) ~' b$ _0 |
0 S5 b7 Y: F, I# |6 Q1 sforeach(row; db.query("SELECT * FROM user LIMIT 10"))- C/ s6 n8 k# Z
7 |- L" ^# b1 u' R
{" D& h% I5 r; | v7 U0 b; h* q
$ |2 J: B$ W1 i( _; T" O
writeln(row["username"]);/ e3 }$ } z9 g% S& i
- a5 i, k4 x+ U- z4 y; ]' ^
}( m6 W! ?" P- |* |7 W
' J6 F, R R& O9 D. e
db.close();
5 t# U) |# ]/ R- S* |/ ? o2 N+ t$ F5 o9 y8 M' ~
}- @0 ]! y0 \) F7 r
! X$ s) o; T, V; H& @6 [2.2 : Rust 查询数据* ^6 Q3 ?' {! F* l3 R
d7 u: S+ }9 \2 [
extern crate postgres;
/ x! }) p) ~5 l5 ^- Z3 z# z# O$ Y* z7 N9 Z
use postgres::{Connection, SslMode};9 K+ j0 m& n8 }- y0 j! }
8 t6 c2 P7 C# s* g# N
fn main() {
" @1 U# m6 t6 I: p4 G7 ?
8 Q1 ^& E* t5 A/ klet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
' `: W6 y8 @7 F
( E* R* y0 v, `) }for row in &conn.query("SELECT * FROM user", &[]).unwrap();
5 }2 F4 R+ h# K' \0 M4 h
7 I; f2 d% K% l6 _9 O& D7 z% aprintln!("Found person {}", row.get(0));
) ~' g) j9 H2 g9 i1 n( G- I: w5 t- l: O1 v4 F
}
5 p/ C6 V3 Q6 _/ c* q( u' O; {1 H! V9 O
}
l9 x0 T s! B- W- m! R
# s) L: M; ^* f7 u, g2.3 : Golang 查询数据
0 ^1 z" O( l9 c' n, g- E9 a3 U+ [- S( e5 g( }3 A% B
import (% G( R4 S. U8 Q k
3 W+ [- Z, ]" Q: ?2 {3 L; n"database/sql"! H9 v# r4 N! N$ ^5 m+ q$ B
1 [; [9 z1 `6 @3 ~; Z& q
"fmt"
W" F& r7 c1 P6 v; i" Q, a3 O$ b& q: c4 w
_ "github.com/lib/pq"+ A# T9 H- @1 ]: E7 w
5 b, G) i& w6 n2 @! [5 Z
"time"3 ? a- j2 y! R+ o! c
4 j/ O; q! V, j# n& {"log"
8 f7 H, S; w% o( |2 H$ }$ m2 |2 q2 C$ g" c
); X# g; N' c4 V# H
: T8 q" i4 S, ^+ X2 Y
type User struct {3 s8 y8 N- t3 C5 `
$ K2 C l- x+ T+ d
UserName string# s( e( z+ r9 F& T. r6 ~, ^
7 M8 ^/ R0 c: r$ z* ?2 [$ u [}# S# L7 c" x! P( h' ]/ X
% I9 D, z- A( Z# Hfunc main() {
0 ~; J, I8 |& ~
, H, Z/ o% J" c: Sdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable") o, l& U# a5 y
6 F: o, z, K- y0 f0 R
if err != nil {/ p- s$ @1 p1 z! A
0 O) H8 T3 u9 U. _& R( h/ V' q2 Z
log.Fatal(err)
2 I8 C+ {1 r0 x0 e% N! M" Y' a9 Q' z+ \0 b6 l2 j+ T6 |& y! P* I
return nil
( U) z6 e* a- n* D) s1 X: N" m. V0 D. B8 X$ ?' q8 V! m
}
: e! U q: {) T2 `- A# l8 c; F7 ^+ L% N% ]% V/ y
user := User{}+ h' w& _ Y! R2 e3 Q% r
- s/ }, P j7 N
stmt := db.Query("SELECT * FROM user")
% l/ K$ ?+ ?& m! ]
: E' @) l1 i) }7 kfor rows.Next() {
1 i ~# u% P0 }* G% r- m: W( D0 e! ^1 @* w+ i
rows.Scan(&user.UserName)3 J! n( s; K X k
: L9 b- \4 x- i/ [9 d6 {9 efmt.Println(user.UserName)
. m5 l1 V" |5 ~% x+ f$ F4 Q" `* S
}
$ Y A2 Q- |9 N
2 X0 `& S. m% ]2 f' e; o" t; F0 astmt.Close()
9 E8 _: ?/ x1 C) i9 Q+ I
: p2 D9 ?# L0 d% m: y s! `/ }}
1 ]5 E u. F6 \& Q( R# C7 z" F+ b: C2 D4 ?0 W2 {
三、总结" r: ]2 I( Z2 k5 A7 |* w
1 t: e+ A- h$ ~% r对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。 I7 i5 H( I; h& {
- S/ \! g2 [2 n& n* E& f
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
9 w( o" O0 k- ^# m4 t* E& L! J7 O- {, _0 W3 j4 a8 z0 s
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。& E" M/ ^7 ~$ g6 V
+ r( |0 ?5 n( P总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。2 `# L3 U* r& p( R6 K# a" _" b
————————————————8 O, E8 n" |0 X2 T# Y
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ V: Z! P* D D$ w$ W+ ?; n
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961, C$ Q- A+ A: I. u) Z, q) s" O
2 h: E& C' k! B* @0 }1 @1 Y |
|