管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
4 R/ R' x' G: M
$ F; W# ~/ G7 f! \一、数据插入 - INSERT6 E9 ?# H6 v& B% v
4 D# m- |. N. {& k1.1 : DLang 插入数据. r2 Q# w1 Y8 p
: h) @8 ]( c3 ]& v. }import std.stdio;
7 ]& r' ~3 _# _5 Z' v4 i8 R
% F% u- ` K3 ^$ b& J4 ^: }import hunt.database;2 [7 M2 O" r. ]: g$ c$ p: C! s
% b0 D u1 I; [0 d! D* \9 f+ p
void main(). X0 _9 x' ]4 b# r5 t" I
" |5 W$ \0 ~$ J( N
{
7 M% `1 Z& P2 j* O) P3 p4 x$ j3 i
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");& t2 [8 `" `. F. e8 F2 O7 P
1 O, n+ `5 |, d I* c% L2 D& y9 U
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);/ T4 @! e: x4 A+ o' P8 [
* e- m' h9 \0 g3 Z/ g) A! ]3 z
// 打印插入数量* c* y, [; L- u9 {/ h/ l* L( P
. l8 p# @( L2 F* d$ e
writeln(result);
' u6 n7 w. [) }4 `8 |" G! E7 n. ]0 f8 T& d! p" l1 }9 G2 t. b
db.close();; D% t5 a; ~2 I5 d& u- u' o6 J
: M& O; P; A& z3 j- e
}* M$ f, `2 M9 h0 ^" ?% E
0 e8 ~1 K& x9 C- L4 S1 v1.2 : Rust 插入数据
, u5 F2 ~" ~! F/ `7 W8 i3 S% L& {9 F$ f( O
extern crate postgres;3 ]$ @5 s6 @, m+ u$ U5 w# j
' c k/ {# `3 \$ R6 Y; B, vuse postgres::{Connection, SslMode};9 r! M5 w. K8 q: N7 y! Z2 x2 `2 J
7 ]" \) w7 q/ ?. A9 v
fn main() {4 _7 M" w9 T7 V5 q* T
1 f6 Q% q/ Y6 S. A+ a
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 }* n* d+ P; j5 Y/ @$ m2 ~9 A
: r! w/ v5 A$ o: w5 bconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
" V# l8 }' }! N# m* W
6 m2 C5 \& A! ]$ F$ ]3 M8 I" q}$ n+ C, `. q, G( l$ ~
2 _6 O4 o% p% i7 x7 X' u) L& J1.3 : Golang 插入数据9 N2 {8 c$ d, z! }/ ^$ K/ Q2 F
3 v& {, P/ i1 k/ d5 [% himport (8 j! C# s9 J2 m6 d( b
* V3 L6 q" g* I+ S"database/sql"( B* S; R* X+ M% v, J: j3 M3 q5 \
& e/ H+ K" e% ^( @0 j& |7 W"fmt"
& b" f2 S. h+ R* K
" r( r0 o) [+ V! {& m_ "github.com/lib/pq"
. r. A( m, E* l. [. h# _& v, z% s: _3 S7 j8 a$ w( S- o5 O" ]
"time"; W! {7 N( R7 s
5 X G9 {/ B, {* z$ y5 U6 @' q
"log"
l) k( I+ G' C0 ^2 |: Y% [: R
5 c- [( w/ e/ W1 j)& G* m! ]. e; u3 Y! T* ^
# [7 i6 H, r( ?1 {func main() {
- C9 q7 ]& C% ~2 X0 M" T V
+ l9 t0 h0 \# f Jdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
% ]8 i p) a# [! h* v$ z8 r
- B1 f! \3 I: H& n/ k4 Q- _if err != nil {
9 l$ B" D; r& L* g* A7 X
% z& M5 [6 u; f( olog.Fatal(err)
. w; w5 u1 m; _& }% y# T
. U4 P5 |8 Z N+ M) Nreturn nil! k7 p$ ~7 c5 `8 r$ D+ a1 F
V1 }9 F! r. b" H} a3 P) w; G! T0 h
/ s+ C, y1 V3 L/ }5 ^. K2 l
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")! m; c/ D- u5 i9 H
) M: r# H; a8 d% \; a) Kstmt.Exec()8 w; N T8 u0 d! ~
' y7 ^! [6 s7 {/ k' V% W0 A& n8 O
stmt.Close()
) Z4 T5 O% @- ^# ]3 D% y
& P* V, O: X" V8 m% t. L' z" a}6 i8 h o4 P, \4 Q
1 ^0 X. t% }5 x; c8 T |" o二、数据查询 - SELECT
7 N8 i! H+ Z3 t5 Y9 V2 v" U; i3 d( L. |9 m
2.1 : DLang 查询数据& S& k/ H* |: c
# M. P! e0 M: q: u2 [
import std.stdio;
4 b! k+ U9 C* O8 e; B$ l8 w0 v3 J8 ~+ u. o9 J. M, M( K
import hunt.database;; w% ?. ?* o" } j2 Z: J3 j
7 C8 O& E) {2 c% Y# K2 ?void main()
/ Q7 ]. p# d6 q9 I- ?
% B/ P. {, O2 k* F& `5 T c{' P1 S$ e9 e7 G2 w) }
6 P: s! l3 q" {' |auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");. ?% ^7 `( \! {* P [4 U; M
: m8 Y. n6 K8 S8 wforeach(row; db.query("SELECT * FROM user LIMIT 10"))
& W b& |; B1 P4 l9 S
( ?& A+ m& V0 [; j* a; F _) _. Y{
4 H) }4 P$ }2 X! n# C$ a2 t
& h4 f) d$ H: z( [+ gwriteln(row["username"]);
& u; y v5 ^" n. j# ^
0 g C; L7 F) T7 `& z% {}
; B5 ]7 a: U% O/ a1 x5 g- o* M
3 X/ N4 O/ ^4 s5 x% @+ Cdb.close();
% q% k0 g/ z2 m
7 C- @0 s1 u2 {}
`: g( l$ T' f* }5 R0 J" Z$ X) C6 a0 F
2.2 : Rust 查询数据9 g; G. u$ D* H2 v
" ^1 c# l: D& c9 Y L uextern crate postgres;) {( Z7 ]6 ]% ^" B# F; ]' x5 n8 u# x
( N5 }% s5 ~( i+ m: M' X8 h: b
use postgres::{Connection, SslMode};
& H0 E% ?% A& b. c/ J! [& \/ I+ F/ J1 S& A5 D1 [0 ?
fn main() {
; Q. x$ F& o0 p2 n" w) ~9 t0 b# r7 K& C8 Z! P, y7 L0 V# G7 p
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
5 O- A/ n. u" e" o- a; u3 W
) J2 p1 c5 O9 t( q2 `6 Zfor row in &conn.query("SELECT * FROM user", &[]).unwrap();1 H# H& @% s0 |" {; S
3 ~5 g* P3 A$ S
println!("Found person {}", row.get(0));
0 {7 u( I) B: a3 u) c
2 J/ S3 O( }, D7 ^2 C8 @}
' Q1 x% k7 e* j/ _6 O
! T3 y4 p" ]& z: f2 s) @}% X# h9 e! E, w: Z) r2 ]- x, C$ C
: m, T$ n6 S% r% s, |* {# e2.3 : Golang 查询数据/ H8 a, l5 a l& ~" x3 O) X
* e) |1 s2 Y4 t- B8 c0 r
import (
' }# k, @% _& E/ Y1 D! X: z
' i- j" J7 e+ M" l1 J" w"database/sql" T. O5 V6 _( u! d' s& U4 y
* {/ q1 ]. b& L$ B) J"fmt"# Y9 h n. U7 X
, z/ Z$ y' B- L+ g' s9 T
_ "github.com/lib/pq"
8 ]0 m, v, K3 l+ L9 L2 O( L$ H9 K/ V- N9 c& J0 H
"time"3 W# a2 N. N [' `6 w
. D; N# j# y% D! u$ {" b
"log"- C$ H4 N$ }$ P1 e1 J4 c& U: z
* G# b0 K5 G" J5 D
)
& T, x3 ~: ]9 Q% ^4 M2 }
) ^* i9 W6 K7 y' X+ i4 Btype User struct {, G, o3 H2 o+ Y9 S
! ^7 |7 l" x' \' [+ k( V# _UserName string$ }' M6 P3 g* [
+ J! l5 W/ j& H5 x5 S
}
% ^; O1 l$ J* A+ r& X
2 a* ]: q7 d3 f9 H" D% [% efunc main() {0 L' X( [) ~4 Q; g
% R& s \- Z" h1 k+ w! [- B2 ~db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
" Z/ X4 t" k6 t5 s$ |& u3 ]& K3 W& r6 N. a1 @
if err != nil {
! _+ z) E# U7 @! T8 Z3 j0 R
# l5 J4 P& u' k5 Q& ~) [0 blog.Fatal(err)
: D% k2 }5 Z* k* j
+ ?9 ?4 V4 O# U" I4 b8 C; Zreturn nil+ f( j+ n; p- f: `# o. p
* l+ ]4 A$ y' x2 e/ C- I' `}: z9 S3 r6 t, U; c
" K1 }& {" K0 F7 B5 C. u9 I0 buser := User{}! Z+ h8 ^8 g" k& p
% U' M" t" L1 A* Z* E7 s: kstmt := db.Query("SELECT * FROM user"); @9 d* g) P$ M/ B2 c* |
& b3 `* v/ s1 Z6 u" M+ ~for rows.Next() {6 H* @3 H5 f4 G
* [# { m' d- i% l& }0 |; _9 a0 g2 P
rows.Scan(&user.UserName)
& o- I, ?3 q# Y5 s: K y N* G% p. I% j+ e$ C4 ? q @. H
fmt.Println(user.UserName)4 }" G$ E; f0 N9 m8 m
; Y/ J6 _: y$ C5 M; u}
' q0 _0 R: C5 C9 T& m/ }' S* O( W# V- s& h. L* P" x( s
stmt.Close()
K$ K3 l# N, l! U. C4 e5 H5 `( Y8 D0 j
}& B0 E5 Z9 S V% D8 P4 y
% ^ _) d# i$ S0 T
三、总结
7 [& P" ^3 g# Q9 v# r5 x# x" E; H0 h. A. S% y
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。4 {+ m" D8 D9 O! n/ u4 L9 g% h
S$ s0 P8 T, n5 B! m/ N% I
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)' s# W. b: j! |8 Z3 `
8 o. V2 k% `0 F
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
3 x4 h& w. a j$ r5 V! h% C& l8 |, |. h& |2 m" `
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
5 I# a' K5 z) j: y————————————————
5 r8 M! r, S* L& ]+ D: B( x& ^. Y版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% }. W5 N; u% h6 w" x2 @8 l6 ~
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
6 q2 C# g/ V2 G0 A
2 `% i; k! D. e |
|