管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
3 @ T4 o, x( o4 E5 V$ `5 b" y6 K) S) n0 p
一、数据插入 - INSERT
0 q# ]" n& k* s# R- [0 C
, O& z* [2 P7 o2 |+ D/ S6 [2 Q P1.1 : DLang 插入数据
7 E6 A% [" C6 |6 p4 a
2 b& v7 s+ ]0 D5 }! u) yimport std.stdio;. r3 T& W- @* j* @ e7 n* D: H
9 H+ q3 d% s* ?% g ^# V5 Zimport hunt.database;
/ ~' s% P0 A/ r' [- P8 q0 P4 Y5 K" o7 o }. w2 @
void main()6 @' x) i& h8 b* ?6 l2 G
5 s; e( w' c9 _" i) J* E) |{0 V9 O- ~, X, N/ N% \
1 }* H3 R( ^( T! `7 I% Wauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");/ `- D& v* d' B5 d; D0 i
! H9 r9 A$ J* p1 F! H: z
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);# |- a2 T0 f% ^+ I! e6 t
8 j4 \; N$ q' ?! G4 }2 b
// 打印插入数量6 D# h! Q/ D: b; O3 g
0 y) ^* U/ j: Z& O
writeln(result);2 F# t. K- O8 N2 j: Y
* y: s. N5 r* H g3 |* Ydb.close();
+ c; r: H5 [* B5 o
) \0 f3 N/ v8 ^& I2 {+ `) `/ L}
- L* N1 N9 u7 T5 G2 X3 l! }- ?$ D' e# t/ P/ \) N0 X
1.2 : Rust 插入数据% j- a/ A, y, Q& Q1 V# ~) T
U; T' f0 |! q; Xextern crate postgres;" r. H& p1 [) V; a; H* J0 _3 B
6 t- u5 l3 I- i/ L/ X" `use postgres::{Connection, SslMode};
/ K9 }5 [3 `, f8 n e8 |! a
( p+ t6 S7 J: B1 u% h8 ofn main() {
4 ^. x5 @& h) ^6 Y0 s {- L
$ @1 |' B% L: w9 s8 o/ }4 Plet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
' P0 L" Y# c' q5 {$ ?1 ~4 e/ m+ P* c; c6 `* ~% D5 g/ A
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
0 ?0 l' G" m/ F5 ~$ w1 V
6 [( C4 v! J: X1 l8 S& {8 ]! g}
1 S6 v1 J& U* f1 r& t% R* P/ a! M/ ~) `: t
1.3 : Golang 插入数据' t/ s% s0 ?( `$ n( l
+ j9 S7 K6 l- x1 g. \5 Rimport (
0 g# C8 ]3 P6 a0 E% ]
# f& N8 s- [! E7 D/ d! _"database/sql"$ ^6 H! R+ M" f% |& W" f1 F( ]
: M6 K1 k% N( C& u"fmt"
* V7 e+ o7 N5 c8 U$ h; B; s0 V3 J7 [! Q" X# r7 D$ G- L
_ "github.com/lib/pq"
% g" b5 P2 Z4 a( k. P: _+ y* \+ s$ {+ c' `. ?6 F% v8 t9 ?
"time"
, ~' U1 o/ ^# T* D+ V4 ~8 h. o5 f
2 B9 s5 Q* ^! {"log"
/ K7 x& Z, `" U- I
) c% Q( M$ T% z8 Y/ |1 ]8 h& S)
% }+ ^8 {, i$ y$ r2 e' w, o5 ~+ a8 q
u N9 P% W# W f! @8 Vfunc main() {
: v4 @. p9 \) ^' K% P0 \
4 C3 g! E6 y, [! F9 [db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
+ S" r; r9 r: z" G
+ F' q% I$ c% p' }! ?if err != nil {
& ~ n2 N+ r* N
* r4 G. h) _+ a8 c. Clog.Fatal(err)' K1 u( u5 i7 m# w/ O( L4 _7 N
" M0 Z7 y3 y( y2 }* I; mreturn nil( c) ^2 D p" G6 x8 E
7 h$ p! c' X+ o6 x* U2 v}# f/ y/ J8 _( e! i$ D! b
0 n( u" M" ?) y$ }/ C
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")6 N; m: @/ K6 k" H
- [+ J* f- h; n7 T4 ^- z: h. b, ostmt.Exec()
3 Y1 S$ {2 d, d- T7 r
$ v% I" P4 m% Istmt.Close()" D7 S! Q$ X9 @$ m% O( |5 Z6 o
% u7 }4 e1 {. g}; l7 T% V: x7 e( [9 G' p' g
+ y3 Y( D) Z3 {9 E% S3 F! h! r二、数据查询 - SELECT
( o+ `+ L1 M7 N" c5 _ b+ u: a8 q$ B/ D6 F" N0 Z3 X: A
2.1 : DLang 查询数据
9 `2 |- C/ s9 W' a0 ~; f1 r# _2 S: e
" D7 H1 {+ N+ n! R( a/ Zimport std.stdio;$ @- Y5 r; H' P
" ]: }: k$ y! a# a7 a; h+ Qimport hunt.database;: f% W* h# E; Y3 Q) S& |! B& s7 ^
1 ], R9 s/ C4 y, i0 k: Jvoid main()
# E; C, n, w8 f+ Z& T* D9 ]8 T4 f# G& Y3 L( a& E
{( A$ T% [2 H L: C% e
4 V# W, T( Z2 Y# ]auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");3 Q% x5 R- J9 e8 f/ @# ]2 o
7 x' i+ b# m( b( B3 x7 Lforeach(row; db.query("SELECT * FROM user LIMIT 10"))
. w% q- R0 {6 {2 g
Q. j: V% ]& Y{
/ ^1 @! j! u g) p; R
+ I4 {/ H# s. I, X8 m( l0 \writeln(row["username"]); e* h* H( b; f: C, C
! T& E7 {3 g; M/ ?}
4 Z7 ]9 p% B+ b
3 N* K& q7 J1 x4 C$ jdb.close();1 b5 R" z3 n T% H3 C W2 N3 Y
3 x5 U/ g( z# @
}' }$ o* M# H8 p3 D: _# I+ ~) m7 E
1 |9 m x$ a# m7 X2.2 : Rust 查询数据- n. B8 f# ~7 X/ t N5 h3 L
( V0 h& q4 {7 ]+ g: W1 D ~
extern crate postgres;- b+ ~( W; e2 o8 [, [( H! Y1 z. ~/ @
; j" w8 v, n7 ]9 C9 }# ^ C1 ~
use postgres::{Connection, SslMode};
. ^( f( |; g1 e, S- {
% `0 v8 P2 g; S8 d& ]$ G6 J qfn main() {
^% |5 s& h: U1 A
8 f' @$ A0 C6 n/ j5 b' K3 Z% Rlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
3 j7 Y+ T& P( h+ Z& w$ q
* M+ ]2 B* O( @3 Q( I. v. hfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
+ m' ^5 A- X$ j$ g
/ f8 p N. @5 e& `+ a5 j! |println!("Found person {}", row.get(0));
6 A* i9 [0 T+ w! w
/ r0 @3 I/ r/ \4 M; m1 Y9 `% G5 f}0 C) ]# w" J8 a) S" J, b9 \
9 g$ c, g# L+ V- p* W3 a
}
$ ^6 `' [; y+ g8 A5 W/ T, _; H5 {* @/ ^# O, I
2.3 : Golang 查询数据
1 `& M4 y2 S) N! A
8 X4 D: m R7 s5 }6 Himport (
# t5 u/ s$ w @+ M9 [3 e1 f' G$ O) q- m1 W# [5 ]/ O
"database/sql"% s- F" u( j$ r7 F1 }. q
' H! F8 `! ^4 p! K- n4 ~ E
"fmt"
8 o, u f% J% r8 z) G" B- U
. }1 [1 x/ D' R/ f_ "github.com/lib/pq"$ G7 {4 m% }! `
. y( C8 e. a9 H4 M h z"time"( s* l4 u4 ~+ L8 d$ h, ~! f
% ?, \$ ?1 _3 u: t& B1 w: P
"log"
& Z7 Y2 B x1 M$ U3 P. j0 P. ^4 u; m F1 x7 y6 P
)- v& G; M1 ~% _5 {$ ^7 K' H
! Q# l/ r! @! c8 a6 }4 G* Y R9 ?0 utype User struct {
( H! k9 ~: T' j9 G3 Z) u1 g a9 z5 O+ J- V
UserName string
. T- _3 U7 j* J6 i/ S9 O3 v5 w J8 }/ ]: k) u: w7 K% f4 S
}" T! N. X2 }9 s) O
1 P. g! a! f& V
func main() {
6 V- @+ Z7 w6 k4 |. ?, ^# A- S6 ~
! H! |, U7 \$ mdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")( Q% K0 H S7 d, Q T) ^
7 G( B4 N- |1 |
if err != nil {# |: Y* R0 \4 |' A0 x
2 J* L7 k6 O0 t! `, ~' W
log.Fatal(err)
: `" M0 O8 B" g# P" V, Q% E, T% W9 j* ~9 j# v5 b
return nil: C) \8 b, b/ t
$ |3 E" b3 u3 y; I
}
/ p' o; f1 F) a- f2 k
I& H5 h ]5 G: Vuser := User{}+ F) d- B1 |3 `+ m
8 Y U) r# K) H2 j" ~4 f
stmt := db.Query("SELECT * FROM user")
- ?* j2 p3 O5 @! ^& H. M6 t! ^$ E! [' |1 |( P4 p- [% g" H
for rows.Next() {
) a) x7 a* Q8 [# K- }
! m0 Q% {- f( m$ Orows.Scan(&user.UserName)- h7 g( Y9 P7 \" q' C
5 M+ s9 l& B2 ]
fmt.Println(user.UserName). B% d' j; A1 x' R" g, m" A
( E6 E. U" d; ^% T}. n$ q: r4 U) V. n2 d: l
! C! t0 m4 z( J) w6 @" kstmt.Close()
7 ~' O! i$ K T# P ^
/ _& O- o( v2 ?7 O( m}) o/ E3 P/ D8 m% ]: _9 a& W
5 ?8 z# K0 Z F S* c. E) b7 e: r三、总结
# N. Y1 w7 A8 \, r q7 J8 V3 n. s0 s& ]- C* L: F" M
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。" o% }" @$ p8 r0 c+ w+ T& B
4 S! g. ~# q9 B8 D2 j2 ^0 |
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)0 H, T( O& D5 i: t1 n& f
& E! E6 ], X6 u* S6 v8 q在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
+ E, F# x! I7 P9 r" ^9 E6 a( C
7 v% n/ A1 N% F) n3 N( H) w7 X总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
) y! H$ S, S. W$ U————————————————
- P8 c8 w% F3 J/ C版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 }9 `2 ]1 p; ]8 o* a. t原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
" {1 X7 Q6 k1 Z6 ?6 C. P4 }% O& F) H. v( i5 W0 u* T
|
|