管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
/ ^" H- P5 |) ^6 h
% Q$ q" X0 t. E$ R$ w8 V$ `2 R一、数据插入 - INSERT. C' q1 a4 c2 B1 ^
2 T0 P4 r5 W9 A/ M
1.1 : DLang 插入数据
% y+ l+ G: k4 E, i4 n! ]8 B! F0 x& v& e$ d8 `; w, @$ J
import std.stdio;
: r1 |. c7 M7 [+ k% {; h& }! ]3 l- S2 j1 U& N
import hunt.database;: P5 o5 F, [' s1 y) ^
) t- B' S& G |) p& |& u" hvoid main()( t7 s0 D& p$ e3 _8 R
9 }& ?" L! F# }2 s
{
1 `4 ^3 A# e; ^6 Q/ a& P" m* D5 Y5 |( J& v1 @; A1 n
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");. B% x8 E. T- n2 K! ?8 W+ @+ ~+ l
* u' y2 ?9 u N5 s5 V$ H
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
2 ]8 l) A _7 O6 t! N, W B8 K, ^/ |, Q8 H1 x; d; J
// 打印插入数量/ u1 Z$ r" h; Z3 b. n% e) U
+ b( S2 p) m4 u* [1 t3 {4 ^2 ?3 z, gwriteln(result);
+ T1 K5 H& ^- r" M& m
* t' Y0 `$ c/ ? ^( m" b; s; idb.close();0 @+ r. f* i* ^+ ]5 W# n
. b1 F- W+ d, S+ T) t+ Y}! ~) w6 n. ? U( n
3 H0 f) Z0 j5 R! O* j2 ^1.2 : Rust 插入数据# H/ F; j) f# q* x) j# S
. q5 S/ j) ]2 }$ G# @3 n1 _3 lextern crate postgres;8 t8 d" F5 g5 L! r, S& M
( l9 A, j3 H- S0 i! C Nuse postgres::{Connection, SslMode};+ c/ Z4 X# v5 S2 h2 y+ t
9 B6 r! {' J: M1 \; ]
fn main() { l d( P' Y2 P, l
, z3 o& N0 V- {- m9 Z
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();/ w. b2 H! z) @
: j( p5 ~+ q0 I. a: d0 c; x1 S
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();1 `5 Q N: ~5 t4 G8 v, N- l( ]
3 `9 |1 G' c8 z7 w/ [}8 O( \( r' x4 P! A5 B! J& j+ x1 P
" b8 _0 s1 w0 k9 [0 a) _& N1.3 : Golang 插入数据
- C) G0 U: P3 s4 Y2 E* T5 @% j, z
import ( T6 e. f) o+ N" G6 A
3 ~: T: O0 `2 _
"database/sql"
/ j. y' s- _. P+ a7 n& O4 q; s# Z9 q, W" p! X: U, d. R
"fmt"1 T' @0 ]+ Q: l; _* S* }& {5 f. R
. ~" ^4 ^5 D" |, S& g5 I" e_ "github.com/lib/pq"; i* }" X j j1 e5 R o, p
1 w h2 }) ?" B7 l"time"4 E- [) I. W$ ~* O2 f% `
: \6 j4 H, c$ R1 m% \3 `"log"
?$ y: @6 i3 }. | M* t7 g. y1 K- F8 y5 k, h# q: v( r
)
# b3 K+ ]* [' J5 c& B O
8 C S$ w& e% A0 k# ~& h& ~func main() {
! O* ?/ k! w7 v3 c
# J5 M( B" H% }& _db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable") ?: ^. \. B6 `7 n' F t
8 ?6 u+ x4 y8 Q' Mif err != nil {5 X, s, Z3 {2 m2 G
& m: ^9 |& ]& j
log.Fatal(err)0 D. m, U `* I7 w
# d2 _9 O, _1 S! F0 r8 m7 Q2 g
return nil( [6 X5 R0 G4 K' i
/ }4 k$ O# q5 ^' v$ `8 {4 P0 \9 x}
& Q. w9 d8 W& {& |- r9 R; [/ R- @* M+ d/ {" P# j
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")! x. {: j# c: c- w W% m4 }
1 t. X4 e5 P: _! o6 q+ S% o; @stmt.Exec()
5 p- _. o, z J
4 C0 T9 l+ s5 t% ^) w3 ~. \# e: }4 `stmt.Close()$ D- z$ ?% i& \2 U9 Q6 x' V. r% J
D) q! \6 F; z% E+ l# Q. I3 I
}
$ W7 d& ?$ t1 ]6 j6 ~8 J3 P Z. |4 A2 f- z' z
二、数据查询 - SELECT6 L! G) @1 n- W) ?$ B& L' j i% ]
4 o, m7 W- K* z8 d5 [3 @2.1 : DLang 查询数据
2 F7 S* |- o1 x
7 t- s5 l" d% [import std.stdio;9 p; ~/ Y! @- w7 T% c: M5 u
+ L; G" C; v9 o5 N8 @- s4 C
import hunt.database;* t3 _1 w, Z; a& R N
. u3 h; q7 n# S" { Q$ g6 Y$ m* yvoid main()6 g$ {* y. M* i5 T2 b7 J' W
3 g% y1 N" e' D1 {$ H0 p
{8 M8 h7 i ]( y
& Y# {( |0 b* l0 g; ]auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");) | k1 l# p3 H u) i0 f3 M
/ w. H' t' f3 y/ X
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
) V0 k) w: P9 J5 ?0 |
m$ t" g) m% i2 l{
* P; i h5 u) D' }) y' E& @9 }# ~) y& D
writeln(row["username"]);2 }0 i( ?9 Z( I/ ^
8 N% I m8 }3 G0 t3 P' X3 `0 W! M}
$ E" L. [& q! w6 O G9 h4 j8 ?9 w- _ U' p6 L$ k
db.close();
2 K/ d8 u& A" T3 m# \: J6 T2 D3 c# @* G# K, W" Z" [
}, y( A8 Z. y, R3 U7 z, [
/ c/ }- s+ |8 a9 h4 ?' m2.2 : Rust 查询数据% h: x4 ?1 X3 g6 M7 Z4 t3 E: F8 R
8 s9 [2 x* R O' \% B4 Dextern crate postgres;; ~/ Q4 }- S. j$ d# `+ y
5 e, L/ o: R3 I0 puse postgres::{Connection, SslMode};
C1 r5 q9 {9 [6 Z# J; [ J' z5 W, F2 J' [: ~+ k9 T
fn main() {/ B. M& l& V; a. I: {/ |
+ J- A0 I8 r) W# s4 U
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();/ ^; f) ^& j+ |2 }2 u( g8 e
( q1 @+ Z# C1 B# efor row in &conn.query("SELECT * FROM user", &[]).unwrap();. B" x4 H+ C1 K: A H
L& Q" |3 _4 v5 x1 X7 N' c. Jprintln!("Found person {}", row.get(0));& R: l" |1 Y+ {5 b3 C6 L5 l
# n7 L# X$ {6 J6 l; b- \& [
}
" U$ b2 d2 k' z. Q' }3 x: Q9 e+ X7 ~; N5 I4 v
}/ y8 A# E" Q& q" D5 F8 L- o/ J2 o
5 V( k) u, i& m! a' v+ ^& f- z" A
2.3 : Golang 查询数据
4 ~# |& i2 @8 r2 Z) k" @* Z* m( S, n
import (
8 q2 _: v& f, n2 ?
/ n+ o3 M; H# |( ]( e3 L"database/sql"
9 j" d+ M! N! r1 A3 y$ x
" D4 R; j% B) l4 T/ t"fmt"
5 N" ~* o" E% h9 T) U9 K, O. P7 D. P; K4 Z- T9 \+ S$ ~
_ "github.com/lib/pq"' H0 F( b, Q4 d! L2 }1 N
1 Q/ t" l% X4 {# f) n
"time"
* _" t4 w- p+ I! s2 `0 q( y4 i$ z% b/ O, J n
"log": A0 l& G! k) w1 W4 _6 D
2 P- p- O( A# m5 `; T/ |2 E
)
9 y7 N; \# D; O; ]/ L |
4 @# l3 s& L- W" s. l& gtype User struct {2 S& O6 `! c S" g
2 o* P, B& Q. A5 F7 F' a
UserName string- i. `% T( Q9 d' p H
8 y1 f3 Z4 {. ~ N) H}
: J' q0 L6 ~+ W/ d8 p0 q- L5 m A/ Z2 C3 \% R( x, j+ i) C) v0 {: K; w+ }
func main() {
. ]0 A1 U) C3 _3 a
3 n/ v# u0 }9 u/ }; p) k+ r- c. Vdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
! k* h3 Y- o) G/ n: t$ ~) e) u$ V7 Q( L
if err != nil {) Z; a( Y- `4 [! n# z+ t
0 [) M) [1 w/ V+ slog.Fatal(err)9 U* K0 Z3 i6 h/ O, P* d; j
3 [- ?. p+ U3 x- m
return nil
0 R7 l, H( r: v+ U. r) J: |1 i0 o5 t( k6 I3 H0 d, w
}
6 r- d9 W" K" s7 X8 _
4 z3 X. S% l1 D Q4 ?& Kuser := User{}. g A9 y8 \2 Q7 v
4 D! J+ j* i" M$ [/ f: `" vstmt := db.Query("SELECT * FROM user")) F6 z, x) _* p9 P5 s7 I
) q/ Y0 f @5 I5 Z* C* ^! kfor rows.Next() {
) }, @4 E( |# S& Z0 `4 [; H% P2 Y6 I
' e0 X0 w5 p( \9 R- Drows.Scan(&user.UserName)
/ B0 g7 I# z8 H8 k* `. n' u
. ~9 n6 M5 j0 {3 |& h/ }5 Y5 q8 C" afmt.Println(user.UserName)8 v' @" s: s# S0 A
1 \. n7 S( t4 @# X) z; l: R2 C
}* v1 b$ c. i# P* g: l
2 Q) I7 B7 z. y9 q* L) Fstmt.Close()
9 M2 ~8 T7 N+ J" A0 O
( q8 K2 W' n3 U+ N5 b& s U" {}
; r: D( g/ v( }( E4 {7 `- O0 H
1 K9 F2 T* u+ F" T( C0 P$ t三、总结
& l5 r* \- B5 X+ h G( c
. P1 u5 C+ Y+ _1 _; U1 N0 \9 }对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
: z3 g, N f1 K: a v. P* T o
- g' `4 ~. F0 c) Y; C这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
* \. [2 }- z, U0 f' z# X; ] T) I" r
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
+ s2 p; p8 K1 o! o9 ?! |
' U1 }! `# Y6 t总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
# x( d8 ]2 _6 T5 g————————————————
# W; [0 G* a6 A- H+ ]' \- s版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; A# ]) N! i+ e( d* b5 e" D d5 G+ _
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961% f- k8 W+ ]3 N+ k- N5 P0 J
, |8 d4 f1 j4 |& B) x; J |
|