管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。% H7 V0 I. T9 `4 H3 W. J1 Y
! [. L6 \ z% K$ y& U, Y) M
一、数据插入 - INSERT$ u+ r& c0 G. F# ?4 S
) R1 P" y, S. p4 ~! d! Q
1.1 : DLang 插入数据
$ R% N2 K' M8 k+ Q; v8 }3 v0 r5 E8 y- t3 w7 r
import std.stdio;
$ b/ [7 N3 ] I& j/ H
2 a0 @; ]8 H& K/ o4 B4 Dimport hunt.database;' \, z7 q5 m8 ~# U
: Y8 H- A2 b. m$ i$ z1 ~4 G2 L9 y2 M
void main(); [" u# a8 z: M0 g
/ g/ Q1 ^/ L3 G
{4 u$ r. ?7 {& }1 @; s9 j
1 G; X' o' N( @) k: T7 S g% ]auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");! a- ]( x6 ^" ~) q0 k
7 q# H! g4 r. `$ s, C
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);+ n, n! P" d+ J( m( q
6 ]* q: z$ ?. k+ @: f; j5 n! p
// 打印插入数量2 I' H+ }, _% w% ]" S1 k
/ G0 F4 @. x2 w' ]writeln(result);/ Y+ g# r- k! V2 _5 y% w
& a) T5 {8 [/ Z- o" B, S" K: Idb.close();
( f' t5 [# k' B7 {4 Y
% K; i; |5 C3 ~+ {8 d}
8 J! n- ]2 f+ e/ J: X7 B' a" I% Q7 X) p U
1.2 : Rust 插入数据
/ U3 F6 n' a: B! |. ~' D& h: D8 A8 S8 s2 v& K" \2 N+ w
extern crate postgres;0 g. v( D) T2 q& l/ z" v! x
6 V6 ]( ]" L7 v$ guse postgres::{Connection, SslMode};0 P- K y, h# t4 f* x# N
, l& q4 B2 w, Y8 V* o/ ^9 _fn main() { d* S3 d7 k/ X( e
( e: E& W0 x8 e0 X5 S* N, v
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
/ U v0 N0 y( M1 p# s+ Y6 ?% T4 X0 w2 p1 H
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();2 r) j' i5 M) P$ C' V$ P
6 `! y* W' w, u ^2 q# L* W' e0 U}* u1 a+ X" t' t9 F
3 ]: ~1 O2 ]: w
1.3 : Golang 插入数据
- j7 g. P2 h' I" T4 y# O7 D0 K, R8 @+ `/ g! m" k
import (0 k: D" f3 p t- {
0 ~& }8 P7 ~) y6 t( e3 c3 u$ n6 ^"database/sql"/ _) s) V3 H( \6 S- E
8 [# L+ D/ I- q3 U9 q6 t
"fmt"
t# y0 B. E, m3 o' K; k
( M) }, j$ a7 \9 k# ?_ "github.com/lib/pq"
5 N- d. ?1 E1 N, a- c$ ^5 x# A9 N1 ?" P+ }
"time"
, O5 K. g7 T! U# K0 E& @4 v4 Q: y2 x4 h ~2 C
"log"
* c3 A! ?$ z, f6 w8 z9 E% q2 {" l5 l& r7 u% [ T8 A
)- V4 H( f1 d, \
$ J2 y$ |) F: G! j. B0 r9 Y
func main() {
4 U4 W, {& O* K/ x
3 ]3 d! h( B' G( Z4 N( Odb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
! p: m. Q, K4 u- ?1 Z4 m6 ] K: R' I( \" {
if err != nil {& ?8 g9 K) {# ]6 S. B
3 ]$ j+ o6 b. A1 b% }' y( g
log.Fatal(err)
' I, g9 N' C7 Z+ {7 t, T: l5 u( I4 c" e$ P4 c3 `9 H1 z! Z
return nil
8 w0 j8 m2 f1 ^3 M0 {. V t+ B! U: S& f3 z# v* H1 a+ H; G/ }
}
) I( }" e4 B* _. ?2 C& a
/ u/ ?% ]2 s/ f, z C* n9 _0 astmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
( N% q2 H v, F+ Q0 c- E) E y& a% j0 Z; d+ a2 j$ E8 ~
stmt.Exec()
' y3 e# ?: T& h8 |( F0 k
7 I4 k: g1 f) I7 Kstmt.Close()
0 L0 N! k8 n# c. d/ }) z$ N, T8 d9 a* Z0 q% x9 R$ Q
}
' s2 Z+ ^7 ~ p3 }8 {2 d7 r# P! M0 V; d2 a% _
二、数据查询 - SELECT
u: ?6 X ~3 p- }# \3 R) c+ _4 k/ M
2.1 : DLang 查询数据3 r" K0 P6 l! D& C8 S2 z
; }( E0 E/ d6 z$ c9 m/ U @" ~% T) ]
import std.stdio;
: m2 }- |; Y8 d6 A! o2 k8 n3 N' d! }: [1 s
import hunt.database;; k9 ~: | k6 g, n. }
8 w9 A& |) E5 l& K0 G+ ivoid main()
" |' f# e2 C# k5 C; q$ d M0 E0 Y4 L* v0 \& v+ L# Y
{, I9 q$ @( g. _5 {. A: M( t. \: a; x
8 ~' y. }5 C+ J5 Hauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
2 [- a7 Y( m- @( y
( s2 n2 z N9 R# oforeach(row; db.query("SELECT * FROM user LIMIT 10"))/ H! A5 N7 r: h( I8 ^- T/ `/ V% I
6 d) P" B- X7 t. O5 \% ~% M; Y$ y
{+ D$ R* V4 m$ f2 r' J
) d. q9 j6 p7 `0 \writeln(row["username"]);7 {& R h+ b- d) z2 H) F
/ F; R: e) O9 a% b. l( m3 i- g1 ]& x}& t- p' s, F; l) h
8 _9 j; X, ?+ o0 ]8 _) ?- w
db.close();) q3 U! n, P( L# m4 K
1 g8 t4 u6 I. m* S' U}
3 I0 ^9 I. Y7 I5 Z# D& A
$ g' }2 i9 m) k; i2.2 : Rust 查询数据$ d8 W* p0 E( ]4 p9 p( e
7 d) o0 {% [& s* W w+ x7 Gextern crate postgres;# H# w3 d& {. d* C7 A
, z4 a: G" o- l: e8 K: B- ?7 B- ]2 n
use postgres::{Connection, SslMode};" y" X1 i! u% z" J; Z% S4 J
- W* Q8 g, c$ V6 R; g
fn main() {
. Q" V% D4 ?. |3 {- J7 H: F$ u: k! \6 K( A# X6 f
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();% F: Z% D0 }% n( t/ R
! s n* {' m5 e! Tfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
6 |8 ~. f7 o& [* i, m1 c6 A5 k# b
3 F+ R4 h5 T3 oprintln!("Found person {}", row.get(0));
% q3 {/ ?. v- H+ j7 P( t+ u( @. i7 q9 B+ V r$ A
}) o" y" o1 y9 e* Z3 Z, N( p
$ t Y& j0 U9 S# k" P8 h
}8 D4 m- ^! b7 c& x) @
3 p3 c% }& ?2 i" b) l2.3 : Golang 查询数据
) X4 L0 S& C4 e! Y& u4 ~; E/ f( c7 V: p/ s% u
import (" M+ W/ |& e4 Q/ v6 W
" c4 \ o# N) o' r/ e4 d
"database/sql"
5 [$ ~1 J4 h8 i& s4 W) R, V) @! A e7 M8 p; ^/ s, q1 R
"fmt"5 c* z8 y w. C
- M2 ?) g( q+ D" [) K2 z
_ "github.com/lib/pq"
' |" J8 T% W" N$ g/ h) h
z! N/ e* u7 k+ w' }"time"
) O/ a8 R9 h- F# X4 A7 m# {. M+ m/ u
"log"+ W$ H- Q8 y; U0 ]! h/ H
' ?* ` S5 o8 }! Q& G8 z4 H; R)0 f2 E. `2 Y1 @' {5 K
6 H8 P5 y/ T% s* Y. R6 y7 M! ^8 Ltype User struct {
6 Z0 N3 m [. w2 Y
7 G' ~0 g2 P8 E% i. XUserName string
) O. b5 K$ ~- d% o# h7 ?5 q9 J6 C9 y+ g3 F. [2 C0 Q% q( o: l* c. i
}1 o$ }* W9 P( h' d. G% z) `) ^; [
7 d/ P% }% L; O+ D
func main() {
8 Z; ]8 [$ T. n8 Y! }: U9 p5 O* J! ^4 p, p# }9 D& f
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
: K6 c2 v5 {. ^1 U' j4 F- K( i' v( {( [* ?! W4 I' g0 `
if err != nil {
1 f. d, f' `; y6 N8 u6 i* Y6 i
: P' o" V7 x; C% p- O: K3 ^+ b+ flog.Fatal(err)" k: b; u8 O) Z( q& o4 o
3 {$ h0 |* M5 p4 E) f# Rreturn nil" ^0 h: t) c( j& o# { x
0 u) L" M7 {$ Q. I2 N$ l8 K' s5 {+ ?/ E3 v}
3 t0 u2 R, b- S7 Z" a+ J' i& \* P
user := User{}
9 R2 |7 I) _, W1 c: Y' K# {. |5 U3 H: F c( O
stmt := db.Query("SELECT * FROM user")
. C0 ^+ [& \* @' f& {) r0 i+ A$ U: p0 M4 c6 m: ]
for rows.Next() {
- s0 V0 j2 {2 t' F6 F. E* \, B A( g& r' O- P9 b( [
rows.Scan(&user.UserName), T5 F; N' a7 C- t8 k
. r' z; T* H/ s+ G2 e
fmt.Println(user.UserName)
$ Y b- j5 H) l9 y7 h" i5 E: B( ]7 K: ~; Z# |
}/ U9 N$ f3 Z% o; {9 I# Y" b5 o
7 V0 P5 v, h6 c0 p1 {+ jstmt.Close() |5 W! K( f% H. b: ^- d
0 `$ O# k/ }* g, t
}' F. r, Q; K9 U1 U3 n
2 ^2 O) o. [7 o/ T# ^+ Q8 \. J三、总结% t) a1 a/ G' a( y9 l
- I5 X$ R6 d' i0 a6 c% u# `+ K对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。$ ~% @0 q( b3 c, U& q& X6 \1 j
5 \' N' h/ x/ [这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
! E6 d& d# [: _9 O( u
8 z3 m4 m6 f+ a9 H) w- D2 k0 U在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。2 p0 D* Y& R& G p2 N, h% d
3 h" J1 W' G* Q9 d( M总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。4 O- u `8 |2 t4 Z0 R3 t
————————————————6 C9 ?; z- B1 Z0 u- S6 G$ H
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- Y6 E \9 J1 e
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
. i0 a6 h$ I9 a% [) [7 x. J. `: }' W* k# Q; T: ?
|
|