管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
/ R& P; z$ r5 B2 Q& Y6 C3 g9 X9 t
# P1 j0 }6 q9 s5 k" \& Y3 }一、数据插入 - INSERT& C! _! _& x3 X3 \9 d6 C( b4 X
: T2 [- N4 V, p/ C, G
1.1 : DLang 插入数据/ v5 @" V, q9 ~, y$ N' }
# x! J6 S( X S
import std.stdio;
2 a- S+ z2 ~; A+ d8 Y) C. _* l" ]$ t1 P7 V; e$ U
import hunt.database;
8 }& V% d- G4 B' s) h; d% X0 t) Z7 W/ I( G6 d1 n' Z2 f
void main()) j+ f2 U5 t7 ~4 E# B% G
0 ~. I) U P: {5 n8 K2 B: M{
- i( e8 F+ w( ^4 `% r
- ^1 e( _% @# E Q$ x- ]auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
: u& l$ }0 m+ T. |% @; u, v m( ]4 ]# ^ M5 K& i
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
- }4 @( u7 G8 w( U* X, u R1 l7 a. [% Z* ^* a) \/ c0 `
// 打印插入数量
3 \" s! w7 t3 v! |" b/ b9 ]7 r) e0 X" g1 J1 t
writeln(result);8 {8 }: T; q0 W r) P7 ]7 A
" r4 Q8 i9 P9 c. P. z$ Q
db.close();- P4 V& f3 p% x8 w d- }1 Q
2 V! \$ {$ M# q}
1 F- N* ^7 h5 m! _0 D6 G5 V* Y8 z5 ~5 M9 [7 ~
1.2 : Rust 插入数据1 K. o9 h6 K! D- u- |" @' \
& @ ~0 y, {' V0 Textern crate postgres;
- {" q1 Q: J5 A/ r2 x- D# P# N [6 O9 x* \
use postgres::{Connection, SslMode};5 I5 t6 J! R6 ?0 i4 m
, T8 [# u. m) }fn main() {* G5 \5 I4 _! o' o2 Z7 t5 [: j
8 u/ b s3 b; J, g E# n
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ e7 v+ X& c1 H0 P; K
4 F& C& F$ C+ F: _0 L" S% @conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
1 M0 H) {* ?/ p8 @6 e
1 ]$ m: U/ D1 d. p}
0 B" U8 l e% D# ]) c
- V$ B; H' k' k% l v* j1.3 : Golang 插入数据
. G6 Z* b0 K# c9 F1 n
; [5 E; }! J7 i5 \$ {! C p Mimport (- a' c: X. P2 z1 H
4 @4 D8 @# y q8 p$ D"database/sql"
1 D2 i; L: \5 e6 U9 _3 ~) b7 u4 I; h- d( E, F
"fmt"; N2 c& j6 ]8 P
8 q# m; q1 I, g. h_ "github.com/lib/pq". U3 }8 r: f; ~6 J0 v9 t I
$ F3 u' u( i6 K; t4 V0 B"time"* Z/ a9 t" ~/ F7 g
% W9 g6 S N& p
"log"
1 W' s/ @4 X( n& t% G8 R- |2 T! Z6 y+ p& n2 Z" t0 H0 c
)
9 Y& J0 A1 c" h3 x3 ]( Z# I- e, Y/ x$ _$ V9 s: l& M t
func main() {8 s$ F0 E) {* ?5 O+ m, m0 C
$ H: M% Z3 P2 }" Bdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")( T) j. G4 }7 \; ]% N A- t
1 |5 `9 p9 l" {. K) u! Mif err != nil {0 w( ^6 _3 t u$ n1 V
7 U- B# T4 P' l) F+ w5 H2 Xlog.Fatal(err)! I9 r* X4 j2 A9 f8 y
" S+ }1 H* ^7 t1 @( x* n+ s% A. N; p
return nil/ I- C {# w9 C+ c1 K2 F# g
: v1 r3 J, M, h* y9 D
}2 V7 g/ ~8 L; p8 l
; O; q) S, q/ U$ A, D4 W5 o# s8 i9 \
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
1 n6 {! c: y$ u6 z) F' R0 g
8 F+ Q% C/ W$ @$ S$ W& x2 |stmt.Exec()4 d" y4 F" _% ~6 Z. v5 z
/ d5 ~0 o) i; N+ Q/ ?* H/ R! ]& x
stmt.Close()
& M5 e+ F' }- m3 B! g1 O! ^- M# q0 l+ I+ l }7 W, f+ ^$ w1 R
}
( o: U, h" [7 w& K6 \* c7 Z* ?# Q% ]# C
二、数据查询 - SELECT
3 [; R+ X/ S, P# }: v8 V
" t8 l4 e4 e3 B$ T; u% k2.1 : DLang 查询数据
* f) a) f. e4 a5 M- o: z; f) {1 X# X$ I# m% J. U
import std.stdio;( R! }$ b6 S% K) w
3 c/ r2 N5 T% x; {9 y1 h- Timport hunt.database;# {& m! v/ X2 M+ S0 e$ i2 O
' \4 w6 E5 K* v8 L6 M$ J
void main()/ J5 g% q4 W- M
1 T8 A: q- W# z5 k" B% _3 Q" T
{
6 o7 N8 N; z! F+ i! W# `/ O
' S7 Q7 y- c: U, S5 Cauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");3 ?: ~$ j. M# X* \( V B6 m
( q$ e% q( ]( u$ [" Z) rforeach(row; db.query("SELECT * FROM user LIMIT 10"))% R7 ~$ I0 q6 ~6 V- L
4 ^9 l3 [4 f" p, S( o{; J) a' C/ ^1 ?! m, k! y
6 W" c$ G. Z1 u4 B9 y9 Qwriteln(row["username"]);" y8 K2 w5 Q; e0 O" {
2 x9 @3 ~* D, N; p- p& }
}
! l7 |8 _. `) j4 C5 \
9 K0 g5 I7 Q2 `: E: `5 e- A( I; adb.close();& ~/ }( U$ F( V1 a5 i# s
# H0 T8 m" T" s8 ^8 C}0 Y- i3 s" Q( T& s& Q+ m/ D
) k7 i" w2 Q, C( n2.2 : Rust 查询数据
, `2 r" H& V7 T3 }, G4 N- K/ h S6 x$ u7 G" R
extern crate postgres;
C, x4 j' l9 n, h# K
i! I2 K6 R; R% d0 ^use postgres::{Connection, SslMode};: Y8 s' l0 r/ S: W, L
; q# f; o- ^5 w0 z$ cfn main() {# p$ t W. {0 D8 K/ I
0 a0 e$ [, R" b( C3 r) m: tlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();; L4 D+ K! j+ W% Z
0 p* r1 ~" e# |; @
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
- Q( Y3 M. M$ Z& {/ Q% ]+ @3 n0 H) q+ Y- L3 E/ h! b/ m$ l2 n5 m' h
println!("Found person {}", row.get(0));
. O) w' a( R. C- p0 a/ [, V. h ]. ~# U
}. d( m/ X" ]* S5 O/ s3 i- a
( x) w, @ R& s2 u a% J
}
( |$ @/ V A) U8 B2 q* c. ?* t1 V- O
2.3 : Golang 查询数据( d( h& \$ i& p# n+ }4 H: l7 D8 o
, F2 Y* Z+ j& r9 R; }# X/ V& J# d
import (/ R3 H3 K6 S& P7 l; y
0 C+ n& K2 D% l: R
"database/sql"7 p) H- Y6 x# ~( O
5 C ^$ u% H/ E7 O5 n
"fmt"- }6 w; d! @+ x& D( E0 F
4 f% {! }3 J. k
_ "github.com/lib/pq"
: I$ U2 T0 G4 y' O4 t2 b
* v2 S+ v1 y9 ~0 y( \"time"' ]/ ^5 j% K, s7 j. x2 b2 o
5 x+ Z3 x$ V& I8 y: s; i"log"
9 z0 D H4 I' b: M t$ ~* B3 P; x% U5 ]& P. L1 T+ t
)
3 ~' q( Y0 |# ^1 g2 M7 g' u. f2 r( b
( x: W9 ?) ^5 g$ ]9 \9 _ ^& M8 Y4 etype User struct {& I( E s8 ]& v" {
1 [: \$ v9 t" sUserName string
. P: B. k4 C1 O% `% j8 b% B R! X5 {+ a& |% U
}
* j8 P7 O# m* V
; g% [3 i6 n _" _# i v3 ?6 Efunc main() {# u m& B" J. v2 w" i" D6 |
: M/ u2 ]# r# @3 \. I/ P9 R3 a% \2 D
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")7 T! S( n4 y0 d
; l! ^3 T5 b9 |. |; q6 @if err != nil {
+ k2 E* T8 U) l! o& } p
+ J' T) G g1 f( U% mlog.Fatal(err)# l* K0 U( ?* s4 Y) [
: a# W- s$ \1 i* p8 U1 oreturn nil
5 \' Z% l o, z/ k* u8 [
4 K5 @% q+ @0 o$ F+ o1 k0 L& Z}
+ V6 V7 u" C: Z1 S! [7 |2 g" E. T8 s0 s! i3 \! Q
user := User{}" }) r% b$ Q0 |4 T
0 Z: b. H6 R1 m3 K/ @. r
stmt := db.Query("SELECT * FROM user")( t7 P# s, e& C8 m& X$ H
: d8 x: P' C& u7 ?
for rows.Next() {: K k5 y! X+ [
4 M9 x! @6 u) e9 Q* S8 s& }
rows.Scan(&user.UserName)
& g# r8 S8 q M8 R4 o" s3 e8 }. D5 J6 I5 G7 g& k2 a6 @
fmt.Println(user.UserName)
6 G' {6 y9 w3 u2 {8 N" e( a5 B: q3 J: C) \- x$ ]$ J
}. T2 i2 j, S) l" s9 G8 [: ^
! A1 j; }( B+ k& U# G9 z5 {- d
stmt.Close()
/ e9 `5 z5 @% N( _; {6 O8 K. E& J1 _/ R2 \5 }8 X
}& ~0 h7 n( Z R% M ~$ I2 }
7 O) |2 @/ \4 \. m
三、总结
, C. v' w4 L7 i" T0 i. u: O# g w+ ?, {, e4 c
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
% P; j1 ?6 W5 X% M& x, i. ~' s& R4 X6 s
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)' B/ P8 w) @# Z/ o k9 U9 ? s
3 o# R! c6 d; D. `" Y/ B. c在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
5 I# f3 I% j7 Z0 W. ^
( U4 B; H! z q% D' m总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
6 \7 j2 k9 c1 a7 r9 \————————————————
4 H4 u0 ~4 k- t版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
3 A% l/ v0 O4 i) J; T; I5 p( Q5 g6 b原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961& V8 _: [; J" d5 R9 w& G' b1 f4 W
& [ s/ X _. a+ ~! D5 w1 O
|
|