管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。7 Q. t: K: {% }0 d
& ?! w7 _5 J: z
一、数据插入 - INSERT! a7 K5 j( m% b5 J
6 F' H- O8 h6 o3 a9 n1.1 : DLang 插入数据5 Z N6 g. a( j' z
) K& V0 t) @3 E& _, Z" j- y
import std.stdio;3 L4 ~/ m* I$ ]
' ^- G% F' B" }2 @5 L$ Fimport hunt.database;
7 r6 K8 ]6 J V9 T5 P& ~" `8 ~- _) @0 `
void main()" S0 k& c/ _( ?2 x3 `/ B) a3 H T" y
3 [: n7 u5 q3 d; I1 m( s( U
{* Y3 Y: f, B3 b, a p1 K# F
' R# g( {6 P* ]" O- J9 V! Pauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");9 L* f# p% L- ~2 O
6 t0 ^, G% s; o! n" Uint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
" o# I1 G0 K7 M$ u2 g# ~- P7 d6 o3 U' }$ g3 h, N
// 打印插入数量
4 e' u$ q# n. z- m* ]# h+ f* f) x8 v9 L2 H. o" {2 z& M6 B- ^; l2 m/ z
writeln(result);
" }& K4 w* f* y! K0 u
2 D) Q* P' \3 J- E4 Rdb.close();
. z& t' H) u4 o$ q# }0 ~
3 S* [$ i4 E" H1 R5 D% B& K}
" l! X" F2 V+ z# u3 H% T+ H2 q# O; G4 \
1.2 : Rust 插入数据
; V( ]9 ]9 s1 I; A9 c( E* c9 T
: G9 W0 x" ]$ k$ Gextern crate postgres;& X8 g- O4 L7 w [' W
5 j2 d& a; O# ]# \4 n5 X$ t
use postgres::{Connection, SslMode};1 I, H! X! K+ G! y: G
& c/ T% v* `" ]" P3 z! h3 s7 \9 ^fn main() {7 p7 T0 R* o: i$ _4 `
9 J0 D' c9 `# @' l
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
: c) l# C- ?; s! v# h
) m. H! L' d9 m2 Econn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();- N- z I% i0 _ ~9 s
1 V# F# w5 z7 |+ F6 ^1 P}
: k$ t) j i, A- {$ l& i7 w. G" F/ X+ N
1.3 : Golang 插入数据4 g9 ~ U- Q. u: U, D: p/ e% U
: \: X8 |2 N( ?0 J q" A- s0 C$ R, rimport (8 c. C, {# _' ]0 A
8 p6 M3 {* e. O0 S5 }
"database/sql"7 y; g3 ~9 ]2 @+ B; {
( }: n- y+ ^6 [8 D4 M
"fmt"
& j! A! z$ I2 | ?* U* w) b) @$ t- h: k$ ?6 w$ }/ Q4 _. P" H9 j
_ "github.com/lib/pq"
8 x0 n: P9 R m1 i+ h; F6 X% {: j1 `% j& L- T- ]& ?( O
"time"& n$ n: i" g6 `# v
) x( H, T! f* d! S"log"# |2 P% Q5 z3 v7 N0 V3 }
6 |& p+ y# I) X% O)
& ?# O& u' ?( L+ _$ w0 V/ Y( A, u7 H! } V/ ?
func main() {
# h! l' P" h r$ {
) D& f5 b! i9 }& z6 v) e% @% i$ D6 Q9 [8 k' Edb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")- X* f9 y( F" E" C9 W' y2 U
" @2 T/ [% ~4 @9 ^/ |8 Q; r9 S/ E
if err != nil {5 ] U2 k1 V& L6 F* w- A* B
3 r) i. x+ A* e, L9 P
log.Fatal(err)' z6 D1 Y- N: m+ v# w
7 m( I+ g1 R; \0 W( o0 J3 c* nreturn nil$ y1 ?; h& K0 b. _
; ]# w9 ~' S2 k9 i1 g+ @% C; y+ U9 H}
" ^- n) Y5 W8 u8 q* M
- H- i; v9 [6 A% Qstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")& k4 L$ b- t- W4 M7 I
! K5 [) @) S5 X. ]8 ystmt.Exec()( d" }$ X" C9 b# S7 K3 Z. O
0 c' k: i+ ^: [8 H% b3 vstmt.Close()
: l# D" s$ H+ Y" z0 }6 r/ O
; b; R4 Q- N; N b/ v# [8 l}8 ^9 {, n' Y! Q$ G" ]! _
( ]2 [; a7 t" `
二、数据查询 - SELECT
0 X& p5 N! K; B9 r( K0 L9 p
5 `5 J( K! D4 D, n2 L2.1 : DLang 查询数据# j) D5 G9 l. e! ~& g. q
- E) M6 c; J" |6 [7 k% J4 |7 ?& w
import std.stdio;! n2 T# p3 E4 L2 k2 n
$ ]0 O4 V( C O/ x- |
import hunt.database;# i6 D/ [ [' ?
. e$ t) k! a+ }/ v$ Q1 ]
void main()( N h6 ]% \" k# _
5 d2 N7 o3 E" R1 h" p& A( ^( R3 L
{
6 w) d/ m7 C* R0 {1 R) C O. w
9 l# O0 h: L0 d& A7 {! wauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
- [1 ~6 j- Z8 V. x; ?, X# s
- `: t6 e) d0 d5 {3 R/ qforeach(row; db.query("SELECT * FROM user LIMIT 10"))
$ ]+ U% f- X( ~7 r# j# X* m' g3 {. ~
{
0 l; D. v. Y% K9 O% m
( p, m* h/ f1 Q4 @, i! gwriteln(row["username"]);
. [- N7 ?* G3 f) r) u! H) b( E$ Y! E
}& ?9 q9 @9 e0 V5 ]" y
* A1 ~$ X8 ~! B* G' [
db.close();' H& _* S; j! E$ d& j9 _
! v* Y2 F0 ^5 ?0 {' ~1 ]4 e y& ?}
* E, [+ M! B G' ?1 b' v& h7 p/ B) g! v
2.2 : Rust 查询数据: `* E) Y, r7 q2 N n
- ~4 v1 [9 c, I3 ^% M& {
extern crate postgres;' r) G: j* `* D& m
, I3 _5 ^, M- f( o* ]use postgres::{Connection, SslMode};
h3 n- s- K# N! `6 t* }5 Y8 V# M m! M
fn main() {
% C$ {6 v2 x: x' E) u$ ]. c
$ o7 o5 S7 C" \5 {* ?' alet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();' X/ p o8 [) ?8 R
8 ^" O c w4 x2 f. sfor row in &conn.query("SELECT * FROM user", &[]).unwrap();6 c2 t' R [1 u! k
) C. h ?& F: y6 T! ?2 Rprintln!("Found person {}", row.get(0));
! @* l/ G/ K* b5 p. K/ w6 Q: G+ w. d' s# o6 h5 X" ^9 _( R
}' W0 r# \9 g4 I' i) X
3 I/ u5 u9 M2 c$ {# P8 c( f+ j v}, v" i! O' f+ ? [$ x
8 L% k+ N) h2 M- _. K- z2.3 : Golang 查询数据
* h1 ^% `& b& V
( J6 G5 ]% ^/ g2 ^/ z( T: ]4 y' Himport (9 I3 S: M$ m3 x- [
4 {( |# G& z: L9 f
"database/sql"
: ?3 r8 k3 k0 X% e# x- I2 Q. F+ n3 ?+ o+ p
"fmt"
0 x: T, F4 N0 @3 ^2 |! `( J5 y! X, [& X3 ]% O0 [
_ "github.com/lib/pq"$ S; L9 k# l, J/ l
, b# i) t) X: d
"time"9 ^ N" U* U2 ]6 m% g* D$ f6 c6 ~5 ^
7 x! T, T2 b4 i0 ~
"log"8 ]8 U! a- I& g% _0 K$ W' o
! j2 c& k7 p C0 K
)
' C$ c# M' i# Z9 j' j4 h! D$ K$ \, J* j* { X' X
type User struct {5 O/ E( ^- y4 Z5 a' H& W
5 F6 Z& T3 {; a' WUserName string8 z- V8 F7 M. ~" q& s
+ h7 v3 }0 H% d! ]
}5 J+ h! E2 o. K# |& _
' @( v" l4 o4 c7 Xfunc main() {
( |) x4 i# H. Z L$ K, d I s. n
: |/ G* [; N4 R* L9 G6 C7 q+ idb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")# n6 i$ ]+ E. o& z% N! b. q" d
8 O* b n+ F! P. [if err != nil {+ N; ~ }" ^. b) W$ [/ D
# N. i7 ^6 b' W( A
log.Fatal(err)* {: |+ Q7 c3 B: v- P) U
6 J3 {2 V1 O; y2 g7 zreturn nil
1 R# v% u- s: l; ~# S5 |3 k4 l' O
; |- n" x! | T: w. [4 q+ K- e4 ^7 A} k! _5 e, V# W2 \+ _
0 ~: U8 k! n5 {+ N" R% {
user := User{}
* S* f0 M( \( D. ~: C/ t) `, e& Q) Q4 ]
stmt := db.Query("SELECT * FROM user")
3 Y4 G8 o2 n+ e/ n- P0 o+ ~5 | [; ]% v6 N$ S
for rows.Next() {
# B6 K4 |; T: L3 F7 `% i7 G
3 P! M1 w: d6 qrows.Scan(&user.UserName)1 J$ N5 r: J+ e" M, q n
% q$ [- s6 k2 y, x
fmt.Println(user.UserName)
* g( ]4 w* U0 H d9 I6 }/ a
; v& e, n4 }: N+ Y' O0 D}* {4 M% b6 K% X: f0 W
% @4 [% k4 ]7 l
stmt.Close()
J% A! V# j7 _3 `+ y2 m0 W! V4 P5 k3 ]: n' D+ ?/ P: X. [; A
}
& A6 P9 @5 P1 q; @3 C6 o/ w
( }! L7 p1 p9 t, }/ ], N4 T三、总结5 r$ X8 f4 P6 o, z
( ?. F2 g' r( I( c对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
* Y) k# x p0 g% w4 a
$ M1 _2 Q, y7 ]! U- q. E这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
$ u% u% \* ^2 H6 a# W( @/ e
* H' e6 f6 M x# R在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。: H/ x& K* W7 i! u/ J% t
% f7 [* Y: N1 o2 ?
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。/ c/ w" I" a; E4 N; `# o
————————————————
& ]" F& Q |$ d5 R+ S$ N版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: J. b" F" ?% }8 c% M- H原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
5 z& b9 r( F j* W- ~7 v7 c
8 E% \4 |: ~" ?3 @5 \1 z |
|