管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
$ q, }# q) j! X: a; y+ b% @, j/ g3 Q/ X' Z3 A5 g' g1 L% ]
一、数据插入 - INSERT
3 _6 r$ x Y& v+ a- g8 v
2 O) q/ p' M/ B8 F( @: h1.1 : DLang 插入数据3 h9 i( U f1 O& C! s5 N. H, l
& G6 p% m7 \+ I! A/ E$ uimport std.stdio;
! C/ E' F8 r% O* ^% X% T2 q8 L2 V
& v. d8 |. u) t. n3 Cimport hunt.database;
1 ^3 O- h6 A% i- C+ S( a
8 ?3 C V* `; T& k5 Gvoid main()
7 U Q$ [7 U- ?# \+ ?) U8 |* N2 o6 Y0 f! s1 Y; K
{
6 I. C5 C9 N4 n" v% |8 k
6 b0 v) X+ {; A9 I: z! t3 @4 Jauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
7 K* q4 j" U$ d9 ~ E) r
$ k: i, V0 v* ^! X& Q. P& `- i% Fint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
% ~$ o2 @3 B' v/ t8 [" S8 C) M4 }9 R) E6 v" [+ S$ t
// 打印插入数量0 o2 h8 D! c6 c+ B
5 i8 U |; e, v: q$ i Y
writeln(result);4 y& g) a4 ?4 M% S w5 q0 i
5 e3 k/ ]- C* V) q: R y# I1 B
db.close();
0 r/ G9 B" o/ _% w; Q& P6 [) p$ I: ~ L) S& d- @
}
4 \* ~: x, {$ C" Z" Z! L: {0 B$ t: T# R' L3 M( ?
1.2 : Rust 插入数据' v& j* j1 o+ W4 v- @2 n
: I: k9 y& J# \, C
extern crate postgres;2 Z' m% t+ }4 w% q
4 d! m5 v3 J8 D+ suse postgres::{Connection, SslMode};
, Y: b+ y" S, g! J" {2 K; m3 _5 n& a$ G4 j8 G W! C1 t
fn main() {+ U# s p' ?- n, c% T3 |
1 Z; u; d6 I: ^3 D# ~+ `; }) f- J
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
) U5 j) A, \" e
8 b# E7 V u2 ?+ @conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();* K! p" {# [6 v
# q A3 G& l8 G+ l}
/ _+ u0 n1 M) ^9 z7 p, l9 ~9 t% o) p9 x2 {4 z
1.3 : Golang 插入数据% O+ r5 q& F9 I- T
$ ?/ v, u+ K3 M* `" y! h
import (
[: U4 x" ?: i: f) U
0 h/ V8 Z: j* K5 Q% ~+ G"database/sql"
1 T" ?( C, v+ X4 X* y' o( B- X4 J- X/ F6 E+ ^# c8 V
"fmt"
; H) a2 e- N- I% T6 ~- C+ E" Z
+ v( g% S9 i4 s- `7 o_ "github.com/lib/pq"
a1 z6 _1 q% {" O4 O8 q
) G" @9 l2 F# J: v2 M"time"! V {6 y) {3 e5 E1 y
- a6 O6 Y) y) K) z"log", |! q7 C5 R1 w1 r9 E1 k5 p
% H& r) j* v) z! B)2 J9 r7 S: E4 T& h5 V( _
: t3 P6 {4 C- `8 Ffunc main() {
( M; d+ f: M/ c
8 H7 _) Y* z0 X; H: Q7 edb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
/ d- q" H$ V% K1 U/ j2 ]4 j5 N5 q7 ]2 z
if err != nil {) X$ f& u0 }, U' O8 I: L
* s& T( y8 E% B0 K: n5 a
log.Fatal(err); c5 I0 e% {# ~4 @" G+ G( _! B3 j
& O3 X @8 ]+ C8 v; zreturn nil" x) F, P) j2 c( U' c# k
; z0 x5 E7 C7 Z" q9 Z4 Z" m}: q( i7 C" j: A: c$ d& C! L* R* I) M
* C( p$ J, T6 C) X, r+ W
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
5 W* f/ D7 ~/ ?6 L$ n+ ^0 N) t/ r8 X( w3 w5 C& Q8 x
stmt.Exec()4 g* X# ~; ^# w7 V8 ~% f8 t0 D Z
* Q8 q8 h$ h' A% {( `8 jstmt.Close()
. ~9 x9 ?. E8 L3 n
8 s1 r. S! V; m, o3 }}% @% ^1 y# o8 a8 i/ P8 y2 M3 W
& ^ R7 N u* ?2 a1 Q
二、数据查询 - SELECT
R; f) R, s" P6 y; r6 ~# N7 l- Q d2 ~0 d& n/ _
2.1 : DLang 查询数据
3 Z" {+ a u8 N7 E7 f c6 \& s3 x6 }5 U9 M0 K
import std.stdio;% w- u7 d6 z! Y( W) |
8 L! [% y8 q4 {+ c
import hunt.database;, Y5 h# q) @( H. y% Z$ ~5 [- f
# b/ M( P! a& a g- _* y* E, |: dvoid main()
5 W3 _5 D) Z7 C0 R- A5 k6 i$ m* X* P% t2 K7 r# n w
{
9 {" ^! M( l# X/ _- U( i$ h; d% V$ N
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
& {$ b* w: P2 i; l A; X# ?$ e7 g! U4 H2 o/ f
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
5 S( ^( i, d' v- m+ t6 J' C* }: d( {
{2 t! ^6 F% A7 a& Y/ A7 h. \, Q4 K
2 x4 Y: i8 ?3 ?* \& Z0 I3 ]writeln(row["username"]);
( f, f% W, L, M O
0 R }$ z! `# m% \2 u}
# t: w1 N0 o& d* Y2 y7 @$ p
2 g; |7 B( `& c8 a. Zdb.close();# G/ n3 [* V5 F+ |
9 v3 ~2 D6 G a: c6 @ P- k0 N7 q j4 C}5 u0 ]% D4 ]. {" ]& k B8 X/ Y1 @1 z
" h4 `& @. q" T+ M
2.2 : Rust 查询数据
; N2 f) s7 O" L! S0 k9 D" {) w/ t; ~
9 A# X% \% }2 ?( ^extern crate postgres;, T5 N" L0 f; x A
( ?1 k% b9 z9 p& E, n
use postgres::{Connection, SslMode};
/ P; s, z9 p: o( {9 z
7 n% h3 D: @4 T0 g" q8 ^- Tfn main() {4 o* p' a) p2 c9 o" X
+ t% a% G8 V+ O$ c* \* J: b$ x' Mlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
5 r+ I' A/ s; _
* a- m/ P( }# Hfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
' M9 S' B' F9 ~6 D8 K( `2 ^3 r3 z! H0 K* v% D2 H6 w
println!("Found person {}", row.get(0));
- W5 W& L ~* l+ H r! u0 O( T: ~' I/ @( U& T; J
}
5 X* p: J) o/ ~; b/ A
8 B5 x, p; @0 A; |9 a}
# {9 i! s1 W: a* V) ]2 O
2 z* F* k9 H L# h$ w9 D, Q2.3 : Golang 查询数据
# n, ?6 o: j/ C0 s+ u8 p* s0 Y+ `2 d5 A: k. V8 M4 v
import ($ \& K4 \/ \- ?; O7 e
0 k% o/ ^ e2 p' S, j" o- N! D
"database/sql"$ A& P ~3 @; J( g
* `$ P4 m7 e! B6 h/ n( ~) g"fmt"
' B! L; ^ x1 ]2 B& v
7 M C, j5 R7 ?5 P7 y( V_ "github.com/lib/pq"
7 k* t) H: T: E' z0 l+ ]6 h, H* ?7 q, U. V" V, i9 E2 e
"time"
: M2 e8 w9 [+ B: U' P
. p4 ]: V- F9 e) R4 U9 H"log"4 ^7 p5 v# u' h
* p4 z: N9 V9 T3 T w( q
)
' `* @3 C2 D) O9 C1 [7 u
& g: D- A0 h: n3 g# Y+ Ntype User struct {$ ~3 D+ w7 x+ o5 a! u7 V; r) J
, O7 o/ r' A# _+ C+ @% i
UserName string+ ^1 \! i1 q0 D6 S
7 U& I0 u8 M% o d* u) m
}2 {& P# f V6 ^) \
/ a s( K" `2 E gfunc main() {
) @" F' ]! f% E7 q: z8 l2 ~
! T% I& j- |- i, Vdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
' r7 n5 L( V7 I3 R+ Z" f8 m# V# N& i" p. h( J
if err != nil {
+ j1 I+ m; N4 B: ~# z
% D3 s5 C! o1 }, a, ]log.Fatal(err)
' \& D' Y2 a2 l) s$ U/ \
% P j- C% P+ T# e' e- Q7 Treturn nil
' D% N, H; b6 s3 m6 _* f9 X3 i! ~* G
}
' f. d' x# s" J6 ?3 Y. R. {/ |& b) [& v" N7 W: p( W% f
user := User{}
8 F* G" r, |8 g
7 S7 z- y, g2 ^# u' b6 j0 Kstmt := db.Query("SELECT * FROM user")& [% G) F: Z4 d/ @
% S' R* ^( H6 Z& m3 K8 r
for rows.Next() {
: Q$ g! W9 Z( k- I: Y; m; o5 v! \' M5 W
rows.Scan(&user.UserName)
" J4 }, r6 h, T0 W" V0 `1 s; M# r3 z! G% t# U
fmt.Println(user.UserName)' L! ^* i+ C% L* g# X) o9 {8 e
6 N" ^! c* o6 w& j& H1 R
}
7 v# Q8 Q1 V* S! n8 b5 W/ ?4 T! I2 S/ B0 s5 N6 ]& |
stmt.Close()2 o- ?' S) Z4 N- ]
/ M/ c8 n: b. O}
! \" I; ]- }3 y8 x
2 x6 S7 F" v% k$ O+ v% L三、总结, }* v: ]! M& @! U; D# x* [
- H4 \& z$ n" e$ W; C0 k
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。4 K( D- P, o) e
, V1 l6 b5 y+ O$ _4 L' X这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
8 h8 ]7 ?0 F J- b5 g5 D- \
5 R6 b- Q! [1 ]) f在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。* z/ ?+ n" A( @- y4 u* D2 K
* Y. t% p5 r, N4 g5 o1 W$ u1 L9 J
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
5 R6 b; w4 T2 b$ @3 }) L————————————————
2 T0 ?* U) C& i Y c/ F版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
' \, u" \, w& \/ R原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961% l% j' @! }3 J, G! `
2 h% L9 ^$ b" c& C5 X7 _( V
|
|