管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
9 \. r6 F" _$ F+ r% M- j
% x4 H9 i* p& B2 A一、数据插入 - INSERT3 V! t8 ~9 H+ W* R/ k6 f, c) A
9 A/ J! r9 f2 g1 x
1.1 : DLang 插入数据! F6 K3 R, d' N0 l" C# X! y
" _2 M7 @7 d) r: T, simport std.stdio;
/ i1 V3 ]0 k* j. E1 r6 Y, P) A$ w3 E: j! M5 ]* P p
import hunt.database;
$ j5 t% H, @7 G% c6 C8 V7 P S( B- {( T- g* R
void main()
. f$ D0 C, Y4 g0 s0 X+ z$ \, z# c
8 T9 v$ N2 N0 B9 d/ W{
, K, p" F5 ~5 Z c$ z
$ T p- i0 x( t0 e5 n' iauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");) k4 m6 O9 a) M/ c
. G, d: x1 |1 q7 h" d$ B# r- P
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);* C9 w* F0 y1 ^5 h4 n! \! ?% U$ l" I
4 o2 u. m" F* m' l/ d1 w. f: c+ L// 打印插入数量/ p! Y$ ^% Y1 V( J
3 J; |, k$ w5 h7 L
writeln(result);& ~$ f/ l8 q( @- `, l8 K' [
$ Y" y! l; X9 o8 X! I8 t
db.close();7 E! J4 o( x, i3 j5 y0 L# @6 Y
' V# [. Z9 l, T" T* s" K
}+ R3 x9 a6 m1 z. g
; P" @0 `/ f4 U3 i1 D* H4 K1.2 : Rust 插入数据7 y% q, L) U: [6 M
4 V6 M x9 X6 V! |9 qextern crate postgres;
6 ^) g: E( ~; W2 ^6 A' e9 F: Y) j$ G [4 |& b% ]5 d; p
use postgres::{Connection, SslMode};
: M( p- F3 C- \7 ~8 j/ ?9 c1 P
: \0 R: S( M# \% L2 Xfn main() {
" k/ [' D. E7 N3 u3 O% W0 o. J9 \$ q1 v Z0 ?
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
& p1 o( |- a+ U& O( X7 m4 x6 D6 c/ v
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();" R9 N1 h+ T, R3 Y/ C1 g! f& F
0 ]( W# i V9 u( x7 ]: B; s}
0 u3 S/ U8 g. U9 _ b
2 O6 D: h2 I5 |1.3 : Golang 插入数据( q$ k! l4 s# T4 o/ J9 i4 y
" @" N6 I& z$ l3 C% ^' }import (; H$ U6 a4 |: @: B3 w! N
" u! ~! J/ s% K6 E3 r/ k"database/sql"$ @# f% S7 b) w' z
- {$ h' s5 h: c' y/ H! s* C
"fmt" _$ r: j( M) w. j. H; u
0 j" P; L; m0 F- K: f% r8 s; E* G$ i5 \ d9 q_ "github.com/lib/pq"
$ o9 q: G4 V% @) I# f. L: X0 x" N5 t" ~7 d9 Y# \( y1 S
"time"9 z* H+ c% d. T. N
5 `. q' x& |1 ]0 F, B& H2 C, h$ b
"log"7 X2 w. a% K' R
" P( y9 a4 f1 ]+ {)" l( `! u$ ^* K" |3 E: p: A
8 t, l& S+ X/ ?! n+ |6 O9 F- x
func main() {, j' t$ F& K2 K9 `
* T# e: @1 ^/ _# R
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
% r# {3 u1 E* B: Z3 f% q8 v$ W. u' [2 ^3 v1 x% @. m
if err != nil {
5 G0 t+ ~1 M' @ t" o. h/ g6 g' \6 M. U4 n5 E1 \7 n
log.Fatal(err) h+ `5 T/ C4 w
2 U4 y2 _7 v( v0 K1 @+ M M1 qreturn nil3 R; y1 H7 m; F! F4 P% e
- ^0 C* r B \9 i% f8 G( k}( [! N1 Z7 X# `$ Y1 t: b
; e$ Y# T; m3 p1 V. S
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
6 I( \3 V3 c$ ^2 ?/ D
) D7 F% y2 t8 p9 P/ r. w! xstmt.Exec()
. s. |3 u, }1 {3 t7 V
/ ? c) R8 \/ {0 k" }stmt.Close()" d+ S ~- K1 e2 b5 E% `" b' ~
3 ?0 B7 n! t' G}
' i; r& U7 x3 I( @; p
+ q) O) C2 F8 d& ^4 `3 R, |二、数据查询 - SELECT
8 z8 P% [ \5 \0 Z ]* |0 D* b! @9 F2 |! I$ H. Z! I
2.1 : DLang 查询数据
' N% i/ I5 O) w$ R+ U6 G2 i# @( q3 U# a& g& i
import std.stdio;
) `( M% ]" U0 a& O/ g/ l
! N# \7 n1 x) Q* M$ m+ h: }import hunt.database;. K, U \* l0 l5 b. e" m" U
3 F! j0 o' C# p# `4 G
void main()& _% G0 y% A4 w; K& q1 {9 D* \
1 ^7 y. n2 m+ O
{
* d i2 {, J; ~0 l. B% F0 V( `: x! W# V. A# [4 q$ ~: a: X; p
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
/ U6 q9 Q# m+ @7 H5 K& U2 O- r# M5 o8 L' d9 ]5 _
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
% }/ U, }( L; k0 h6 r
6 g9 g7 s+ K+ k; w: M4 V{/ q3 b: n; v; o: m
; I3 o* f& t% y2 E( C
writeln(row["username"]);
4 L3 I$ \; i+ r/ n6 f; e q- W' G( g) S w0 u8 g7 k2 i
}
. B: u) @0 {7 A5 ~1 M
* Y7 O$ M9 F" X. z* V( `* xdb.close();
3 Q# K/ N2 f% L; O4 m Z% Y0 d
2 v+ y3 K% P7 ` ?}0 o7 k: w# L9 L! E2 _3 O5 Z. Z. Z
# y/ i1 q4 a6 I) X. B, {: A. J
2.2 : Rust 查询数据1 G& H' L/ o G; G3 N
6 V; K! K% p) R" B4 x, V. {
extern crate postgres;
; c$ |5 {+ m9 z2 [, W/ s8 h8 ]: F& F4 n, M& b, B
use postgres::{Connection, SslMode};; H6 e" m- F7 H4 g3 R) j
* i; X7 M0 N4 jfn main() {
+ L( H2 x- d ] J! J0 f2 ~3 j& Y- t" W) T# P7 k( E8 V' `6 S
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
( m$ Y; H$ Z" P; X# I
6 U$ @% t8 |0 E* d& yfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
! H% @6 B9 L: G. ^% i6 @, k& g# e J ^) |( H. {. |
println!("Found person {}", row.get(0));
5 w4 ~7 j: C- U2 `5 P
) U* a/ [/ f& t* V. a7 V7 [}
0 Y w9 t- d b2 r' U
$ r* z# F0 E; n* W1 n7 F}
* p" f3 F5 |' Z# T S( s+ f1 N w$ p8 W) y4 W2 x
2.3 : Golang 查询数据" _7 Y1 \7 x0 x3 w* u) h
2 R( O% k' g% y; g6 ximport (
5 Z# [8 n/ M$ Z. n1 q. x) m
. E5 Y1 m9 I0 S/ u9 i4 l# `"database/sql"9 T2 r$ v' Q h8 {+ r
" C& g0 M, B% [- I6 H
"fmt" }. B0 i+ T% G, }+ `! h
- V* e, D5 c6 I' Y_ "github.com/lib/pq"
. S9 m' y7 }+ s3 n, h. \8 _4 d3 ]/ q$ K% m. ?' a9 c0 T
"time"1 F, ] R; k: H" a5 P; o' A
5 R9 D6 A+ X5 x1 X"log"
' f" U& W( v& s) P0 Y6 ^* _. d. N* o( Q0 U
)8 D7 q+ y( S4 n: _# G z# W0 N
K5 W0 F4 @- n; S/ Z
type User struct {
7 c! d6 ]7 {- G2 j$ }, L8 c6 H: v& [% g' Z- { A" y, ~. G
UserName string
$ B6 ?- ^! K. p& r5 v- \9 h8 j; h5 T9 L2 b
}+ @6 s# R! C! t9 L
; S' z( ? Z% U4 K6 `8 p1 }$ ifunc main() {$ X0 X* b7 S4 e
5 }& N$ d2 H) i/ D1 V' m
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
4 D, v; f8 Q6 k' p/ A; ?- E; G; L- k2 S1 O' I D0 n
if err != nil {" F% ?# k* V K0 m
% K p- B; Y( R* ~/ Rlog.Fatal(err)
% Q6 v2 m! \7 ^
8 d1 I: s' w2 N! f0 h" }return nil
8 X; Z- c* w. v
5 U ^: ]; p; E" N1 f}
# ~- t5 |& |5 b# e: k$ e! I
8 o; _4 v* z* v1 G/ @' {0 T6 vuser := User{}
, W9 s" G8 a8 j( ?3 F/ n
* ]. l) C/ b1 W0 ~stmt := db.Query("SELECT * FROM user")6 p5 ~) ^; ? m, F
5 ~$ P# ~' t) n$ J# [* T2 m1 hfor rows.Next() {
: X% h: U6 N( G/ `/ ~" p
- ^. e0 g+ @# S2 Wrows.Scan(&user.UserName), R2 L/ c, I+ k$ Q% q$ d& F$ ~
1 u: S, i& r( s$ _& X3 Efmt.Println(user.UserName)
$ d# F$ M7 V) W5 ` E2 F3 z. g: G* u7 B
}% B# U" A5 g. r* {2 ]( T4 W
( d& Q0 n6 X: Y( H) F. }
stmt.Close()
* Z2 f4 j5 `- O! r2 }5 {. M$ ] v; ]; q2 @
}8 E1 Y! U& e( _% V& x3 P/ H9 V
$ t5 w8 Y; O o G$ ~3 t
三、总结
4 Q1 T2 j/ Q- v: x ?6 e# F% ?% X* b$ T3 W4 f6 _ x# i8 X& ^
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。& f: R! Q4 k7 x" D5 O, o0 p5 p
$ i+ f, a7 A& r# [这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
$ ^2 t( `* G* `7 ^
! c+ R3 J+ i2 b1 Z在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
$ I* Q X8 s& j7 r- ^% \& t& k8 u2 D! \% w+ h6 `6 B
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。; G8 o$ G0 d& U. e0 [2 {
————————————————
) @) X8 R. a. F# `/ s! R! G版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ h% I. W8 I2 Y2 G( Y1 ^6 T原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339619 S3 i/ p1 h3 r1 w# P. \
+ O% [: @1 K* r, f% K/ c1 e3 m: f$ h |
|