管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
) K+ x w! N& {' S: J; ^2 j4 K1 W
6 q* S+ O/ L$ s! B; Z一、数据插入 - INSERT6 k* b$ J1 E4 v- l/ P4 k4 {
( S$ T n5 Z; v1.1 : DLang 插入数据
6 H( l/ c v1 @" D* i
5 C1 W* p& m; q. oimport std.stdio;& i' w2 `: I, H9 t
6 F6 G# S( m& U: k1 H% J
import hunt.database;( A; X9 Y3 E, P6 {8 c
# B" i {6 R6 B" c. \. Ovoid main()* b# t. ?* k$ T( W9 m" b
! \/ W! P- v. } A
{2 F, |! g5 _; j
1 F! H/ g) h; p: r' N( Lauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");0 R- D7 f9 D/ u
: ^1 ~7 ?0 w* Z, d* k
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
. v, Y8 `& Q9 [5 G9 ? S
# I$ Q' N: M% B7 X// 打印插入数量
% ~" G" ^3 W* P }/ U- v" A0 x9 p+ d( n- B) @# {
writeln(result);2 Q0 |5 ?- H- P$ R8 `* U# y
0 Z, o" _* u1 S! Q1 ^0 q+ Adb.close();7 `+ k6 [7 \0 ^* v( a
; k: P& W& C/ J. d6 A}
2 _, D4 m3 J. ~; M$ x" e
0 h- K; [- D9 K+ e+ t# X5 h/ _1.2 : Rust 插入数据
* s B( e N6 r* z% G5 v# j! r3 O5 u- _/ D& p4 v5 s
extern crate postgres;7 W% w' B2 A( J' [6 g6 P O& w9 c
U+ c ]9 c4 J- A& j$ Y# b
use postgres::{Connection, SslMode};
, _ b, @0 K) k/ n# [. {$ d# A r
$ B: [9 T @% {+ K& dfn main() {8 b5 c4 D" s" C
! a/ W, z+ J6 F; P, r$ ]9 ilet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
; g& ?2 S: R9 N5 `0 a- `6 q9 U8 T. c$ f! U+ m
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
" ^% e- H2 w9 Z i* s) r
$ c6 _( g$ o! x" I$ K}
' T; U; F5 }0 Z2 D0 o3 G' {+ j: L& e; I3 H: _ J2 q
1.3 : Golang 插入数据' t/ I7 g9 c: t# O3 x
; p* T4 D& U0 o. `0 S
import ($ a( _9 a8 N# D; G7 |2 m& O
. _" f* l. u7 T! h( e# u
"database/sql"1 g9 `0 Z2 z+ O: `# D
' z; s! K/ w2 Q1 t8 q* d- D"fmt"
6 F h! O3 y3 h" y' _5 ~, d) S _8 H* ^7 }! @% C4 T0 \
_ "github.com/lib/pq"( e7 S2 J% U2 r4 h8 Q. h% U
T+ H+ ^' u# W7 Z
"time") n' O' ~' c- d2 e' @: N
6 k: r; `$ x) @8 o
"log"
9 }, U Z1 |3 t4 B: G% q
2 d( W- T. j# ]0 }/ \. @. ~, `6 e)
- h* f* {* T7 L* [( o
/ G. H8 d) \1 Vfunc main() {
5 {! q2 d9 D* @: f6 E4 `4 g7 Y, y
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"). m C$ M1 q8 \+ J* n% P4 U# ]) v* V
! |# |5 s$ @3 r5 L
if err != nil {
0 \4 X1 \) R: C8 r1 \
* N1 K3 c( N8 `( Blog.Fatal(err), ~1 ?- d$ j0 {7 I( Q% f: z b
* H1 b% t M1 Dreturn nil. U" v# t1 [) E6 N
, ]$ ]2 U V( C% M2 {! ]}
/ g3 q0 L7 g; B9 Q' l0 `
$ [% I- _% X' zstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
+ U; \" y, G& ~' n5 `% o' P, _3 Z' M, O4 n3 }9 I
stmt.Exec()2 C5 A7 w7 Y- b3 v: x
3 ^: u% o! A4 d* Bstmt.Close()
. `0 ~# z' ~' {
0 _. r9 w' P& o6 F7 ]% T5 n}
! }, G. t, P; p- p( c/ R5 |/ {/ v: R& ]" t# d; p5 M' G7 F
二、数据查询 - SELECT
; [6 c7 \8 u; z* |& k; E1 q( a
. o7 I0 c! V' d: `3 C4 d: }: `2.1 : DLang 查询数据
/ E O; l5 h8 S4 ?( X
* r! [7 q5 k9 i0 Q8 l! ^import std.stdio;% C- E+ T3 A) I; L4 E; u
, m1 a& H2 |7 @, k @) _
import hunt.database;
7 B- j f4 x( v* [, ~
5 M1 b( z2 m* P# V( _# \void main()7 Q6 z: \- V J. i/ D5 o( S) ~/ e
, t" B; f0 \5 X- a% x$ I8 q1 [{. r8 J" x P" }% N8 W
3 t5 k4 E1 j$ d/ T# j' L
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");$ [4 s# P3 H- e9 u3 h ^
+ V2 L1 E+ d1 k( s; D4 {) Nforeach(row; db.query("SELECT * FROM user LIMIT 10"))
3 l4 E2 ^. o' X9 E3 u) p7 N0 u5 ?8 ]! Y' Z
{
: E3 V" E2 X7 N
r3 Y" \) }$ D, a& S$ ?writeln(row["username"]);1 C8 X# }1 s' [- G4 W6 c
, h; v. f9 R/ _4 h$ V5 {) B}
9 Z% T" e" y: d+ j1 }' ^0 r) L( _. ~0 n+ J" Y7 b" o/ ~
db.close();2 a: g1 n; l2 ?( y; k; w
* Z* u- w# t8 e0 F}
. {( A% |* O! F
( J8 L, N. Z; S/ O& D3 Y0 G. G% e2.2 : Rust 查询数据 w* _; z- U! ]
* q$ J" E5 t2 J. z. ]
extern crate postgres;
# o2 o, Z3 O2 N. X# z0 h
' N3 \# P. E0 y! I6 N, @- t) @use postgres::{Connection, SslMode};
) C( h+ G c9 n+ C4 x- j5 r
4 D% ]6 s& N. E$ L; b7 S+ }3 qfn main() {
- ~, L" Z. ^, Z; Q2 k6 D% F9 k' j# L( b
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
; E% c/ q- ~6 X1 f0 ~2 n% e7 o% b
% W6 |9 Y( K Xfor row in &conn.query("SELECT * FROM user", &[]).unwrap();& T0 A5 f1 U- S- v8 u
, _+ j/ {9 @( q) w0 v6 ~$ ]
println!("Found person {}", row.get(0));
; ]. ?+ K; [; ]- A4 a$ O) o" Z6 ^& V4 g
}! J1 R" @' J- d
k, e' p9 A+ o5 Q' L4 r}+ W5 N) U% _( _
* U& i0 _" T2 i6 i. w# r
2.3 : Golang 查询数据3 U' v( I& Z# S7 f: C* F
' w4 K% ~. ^5 V' `. K' `3 j- kimport (
: ^) A E- G: ]& Q2 X# q6 {$ w/ O V/ m
"database/sql"
- h- ]: D2 Q* b5 B8 M, ~" @/ o
4 k1 d5 M/ n( \0 ?1 z% J"fmt"' b( S, S$ M. L# e* o0 t5 o4 L! B
4 s7 Q$ o3 X( H; [. J$ k u3 ]4 x& z
_ "github.com/lib/pq"3 |. Y9 Q: E, _6 C1 W) Y0 ]
5 I0 }% d J1 ]- ]% H
"time"' l6 q3 H& S% J6 V) _! U
3 g" F: x' l9 n7 O"log"
9 p# M6 [, A: s, x5 x" E4 F0 t* o3 P$ d
)" i7 s6 s; K5 x( H, V; K
; P4 ^. F1 N9 w' Z
type User struct {
; s6 D/ q8 u1 t8 l% ?0 h1 _! e
- E4 L0 E1 M/ B9 I+ {UserName string: \2 v: C$ v; J% t- T4 V0 {
4 ?# z4 r" b# y$ k6 C}$ w# O9 Z, Y+ |' R8 r) r% P- Z
9 g* r4 G$ ?* n$ \% f/ O
func main() {& J( \7 F( U) w; Y- [! F
; Q* P! z. C' V0 Ndb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
/ K; s: n$ X3 j* K9 x
- S% Z H/ u, ^8 [if err != nil {
" j" c2 N' |. K) M
) n: n& f0 C1 q( J, ^# Z. G: ?0 v( \log.Fatal(err)
7 M* T: y' {6 o8 @4 n# T4 Z& S; a X; b% c* Q1 }; J' h
return nil
" p+ J# F; q4 r) A: D8 F. B' B& ]- v' H2 `% e/ R: O
}
! A) Q7 _. X8 @6 I" J O' P6 {% {
user := User{}9 x6 F2 z. T# o T W
1 F4 R0 \% n( i0 K' \9 v4 L
stmt := db.Query("SELECT * FROM user")
. n9 A/ Y6 e7 {7 z% Y7 _% D9 l: T0 o( t
for rows.Next() {
8 ~ q# B$ h! I, ~
) I$ d) E4 V' z: \7 u6 r' j9 }7 qrows.Scan(&user.UserName)9 l+ r' `7 L S
1 Z$ |) z7 r( Xfmt.Println(user.UserName)- w* b' M( v" ]
2 a" y+ P, t# O0 n# }. V4 F. S+ m* ?}
0 z3 u ]) q/ N9 {1 F; e4 Z1 N* a3 M) ]* o( g+ u
stmt.Close()
! n6 S& p0 r9 q& d, w q( v6 g+ J1 ~/ e; e7 y9 D. n' @0 Y
}
2 Z" x0 ?# {( u+ M8 y, j* _" ^6 w4 N" N0 T8 {, o3 z2 A( O9 e
三、总结
# ^- n# G1 J( X. \0 R. u: P' L _% b6 d- ]
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
$ t0 g: ?+ z- ]
" L4 M; z! E( e3 n5 v5 Q( T" V这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)1 T# O4 |4 Q4 H- J& p* O
9 @) ]4 `) C3 g# i2 S" c
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
p, w& b/ F- U- r; H& y" S. q
9 T7 Y; b9 s5 T4 k' \4 o总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。' [4 b! m3 R7 x' Q/ j/ @1 V
————————————————
* ^( f# ^, u% j, O& k$ w( y3 s: X版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! Q9 p- [9 ]2 U4 N9 T$ e
原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339611 t( _3 |3 n' v3 \1 O
, ?1 a0 e5 z9 h; c* F' ^
|
|