管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。7 ~# Z/ e! h! [% }9 X
' ?& r2 |; u' f7 U% _一、数据插入 - INSERT
; y' N4 L9 f, x
& @$ }- |( B; `9 P1.1 : DLang 插入数据
6 s5 m, W6 q( P! E& {" g
I) f$ x. j1 g/ N% Q. Iimport std.stdio;2 v3 a1 F' _) L4 f! S
6 |* Q- L) _& \
import hunt.database;, E+ m6 M* v! K t1 K
; W' R* I8 A6 s4 }; @# `2 H
void main()! Q) G2 \+ f) z5 Q; |
7 t& v: H# \" |3 d; @$ n! Z
{
) \) v1 V+ f0 B3 x: m
\% x/ J. j" S6 V% I( Nauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
9 Y- g# o4 t0 c
. S |( ?* }- X; P8 ?int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
# Y& K2 m) ~+ i" E6 @4 f' J6 B$ `( q3 m9 e5 r
// 打印插入数量
. D# f5 q9 |1 ^( T8 n }. @6 T8 G$ ?( s3 P* }9 I( N- D0 g
writeln(result);
' [; D: A- `9 I" [4 Z3 Z) A6 d; M* k" p! Q5 ]
db.close();
$ I7 k9 u( N7 ]% [
$ S e# a# {( {6 G- X, i- h}
. u% ?: X+ x1 R- t
b! M: ^. p5 M8 _: c! f. _, _1.2 : Rust 插入数据0 G& h/ g3 x9 \/ h: L4 v, E
6 H# n# Z6 |9 o: B! q' M e- |7 c
extern crate postgres;
9 i- O$ k/ D1 R$ }3 t3 U. i
! p u5 `$ r" p9 S" _use postgres::{Connection, SslMode};
9 K4 F# Z1 h2 |2 W% ?( l0 n. x! E& Y, R. t4 ^. N$ r2 w: b. v
fn main() {& x: R& g/ u4 f& x' m) K3 H$ X
9 m8 K" k% o1 H) o
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
8 ?& y. A; u. N, \& u1 Y( M1 A( _5 ^) K: q- m# d
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
1 T4 ?9 r: L6 N$ g+ n7 Z
7 X( k& q1 j* z k; {}1 R W# Y8 A) G* u, A9 p7 K, C
3 Q$ ?/ W& q# |" d
1.3 : Golang 插入数据- }8 m4 u8 `* b/ ` M
6 F' ` M* A( Y/ ]/ M1 g
import (
; A b# U; n( `- N7 t% _# }& X1 S1 A0 \ U7 n/ G# s- R. q1 `
"database/sql"
& u% [2 a' P: C* B) B1 K0 ]
1 Q0 z3 c$ d; t# N2 V"fmt"
: Q+ z: F+ B3 S$ I0 N! Y* ^! D( v& T9 k7 h% S% p0 b
_ "github.com/lib/pq"
$ b5 @+ V1 h$ b9 k7 s* ?' Q6 x6 v% \' |! T, M' b0 h
"time"
0 B! l' Z7 ?0 U% k y. K; J( L/ c; }0 o. D# b" W: ~* f* }- P* M4 G
"log": [. M U* V; Q4 K: `" P; S
6 t5 o. N+ _' k c, X' M1 ~( G- C
)7 G' C8 y) m0 d6 W5 p5 R6 d
5 C) W! u; Z: }2 g# |2 t
func main() {% Z. z1 `4 ^% w% p
/ e( t/ e0 h4 k/ u$ jdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")6 z+ _4 |9 ~4 `, h0 i
( i& t& f6 V0 L6 J) P0 j% {: ^if err != nil {
$ y9 c9 c8 y1 _
`( k! w: J. p, }2 B* Alog.Fatal(err)) u( m6 Q- S7 \' e7 |6 L4 U+ {
5 n* x' A' `. d4 L: _return nil
4 ~" O$ Q3 y. h' ?+ K$ I
8 {) R$ {: l& O) v6 p$ D% R; N}
, q$ i4 [; ~5 a1 m2 R
/ b/ e2 Z3 j, {( h9 E' o( ostmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")& T7 _$ d! ], x- ]5 |0 d- e& t) ?6 J
}1 {. s' g5 a' A$ f! K" r4 V7 H: ~
stmt.Exec()
9 j1 H+ x: L; X1 q8 v! r8 ]' K: a) _$ G+ o8 z, ]
stmt.Close(). J# Z! o! q8 J1 D# N1 O
$ Y) j" L' x/ c" [2 `7 g# b}' I3 w9 @7 v9 Z' {1 z% g$ s
( Y0 s6 `" z+ ^1 H二、数据查询 - SELECT
6 b6 I0 e" d" K
/ P& f' v) M# z% y2.1 : DLang 查询数据6 w% ]! m4 ?+ ^. W" W0 O
( m Q' F; r) B) i( U& i; }# ^' v5 [
import std.stdio;/ z+ d3 W4 t J# k& ?
+ `8 f# c p( y; l. k3 i; s
import hunt.database;
8 D$ ~- T0 z8 j5 b d( T% f" x5 p' N
void main()
1 W* F D) p# n8 X' f7 W( l! E7 Z; F; O. d
{' B7 u& s) l" a! ^3 w
, u i) p' f7 O9 o0 A$ f- P8 P
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4"); Z* m; c# f% z+ M! \, T
$ F- V! c* u+ [: R* v2 `
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
+ u$ b( L% j8 m! D
4 y. u1 v% o' R8 Y. r! `+ y% K! l. i{
/ P' g! u6 p' u5 M+ R
/ p7 N" k( z+ D$ q* |& y) E& pwriteln(row["username"]);, r) s* P5 H2 F ]- Y6 k' g
2 R" B6 e. m' D# p
}0 h# | k& l" n
) ?# g8 J. ~# Q; O. p
db.close();; @* h( K' o p9 Y, y
5 m1 M' O F( g% @! |: J}2 A- p' Z' H% c- x# G! Q4 S, K
' [1 w$ h+ t' |' h1 k: A& [5 g& q) i
2.2 : Rust 查询数据1 C8 q% Q2 W* R
* u! ], F; K/ n+ u- ^7 a
extern crate postgres;* }8 |1 z/ W7 b
. w# W8 @( z5 Z( b7 v$ B" ^use postgres::{Connection, SslMode};( }! I8 K" O& m9 |, O1 |
: u& r3 M6 h8 r9 W0 W# J) e
fn main() {
6 W6 L& m, f& I
6 L) ^4 l2 u+ C+ a0 b. vlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 T& p" O. q1 i' b; z" |! `0 \. H, Z2 y
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
( u4 A3 t) S& ^9 o, L
, _7 n+ `, r9 @6 d9 E1 xprintln!("Found person {}", row.get(0));
" D$ t y/ E+ T2 F- K8 W) ^* K9 R: E
}
% u( o- `6 E; ^
$ n2 b) h" J- g7 X$ a$ b6 |: v& P}8 v- l2 K; F( P
: A5 L* Z$ D- A6 J4 L2.3 : Golang 查询数据
2 I$ w( C3 I3 Q- c
3 Y7 a: Y5 v' A+ gimport (
1 ~" {5 b# @: a! M4 \8 p4 c" ~
3 x0 l5 f5 U/ B8 d2 l"database/sql"( u- h d6 ~/ G
4 I! z6 W0 `8 i& I- x2 _
"fmt"
- F% j; I6 _: `2 ^6 P) ~7 C
7 ?% X, E" ?$ p# I- ?: Y_ "github.com/lib/pq"# c9 `! P/ |- j7 N: j' E
% T8 J1 G! @& c"time"
& L" W2 u8 n' A. o \' f, \8 d( h! t1 k0 }
"log"
4 d% t0 U! w3 i2 y- I& x/ V$ k# n0 `: Z/ Z
)
' ^* w/ B n/ p% b( {3 R1 s
' O3 C) g& R5 v2 \3 N. ptype User struct {! Q9 v) e! J4 v2 M6 m0 E6 i, |
& Q& R6 n' W! \9 u: pUserName string
: o9 Q* U: n: o; Q, H
7 }% m4 d' [$ X/ F7 _}
) |: D, N! e) [' a6 m% t
3 G8 l& q! T6 Q$ B: qfunc main() {3 W) L; P$ n) t" u! v* Y2 g$ `
' U! A8 y Z T2 H& odb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")7 Q; X h3 h% {: ]9 v3 }" l
' C8 q5 r- G: y0 p2 V6 `8 s
if err != nil {
+ o1 @" ?, T" v/ H$ w6 b& y
# e5 L I* N# Glog.Fatal(err)
" H8 z+ @" L/ t+ E o6 x: J# }/ N" F7 a O0 ]8 J" q
return nil
/ {/ X' ]0 D' v- ]/ I9 @0 v M0 r6 y5 P! m: T: |( |3 y
}
6 m2 e1 e4 M, u5 S6 }4 o* U' f, O/ C3 ~6 n% P$ W/ H: \5 u
user := User{}- x. x2 y; Y, q/ u! D
9 N* ]" W& V% \stmt := db.Query("SELECT * FROM user")' o( M8 K7 {5 P, d, `, Y/ S% r
4 r# U9 A$ Z; ^/ S0 j
for rows.Next() {
/ e2 l9 t/ g$ p& T1 d
4 S2 u6 x0 f0 S9 `rows.Scan(&user.UserName); B% R6 ^4 @, I4 x# g& \" Z( ^! {, {
" ]0 L, r; H. z& T/ a( v! B+ `fmt.Println(user.UserName)
- D9 I! c: ^7 g
3 _7 V. K. x+ B& ]! `& u$ |4 z}
; f: r x- ^7 P5 a3 j
! f9 m0 N1 V! dstmt.Close()
2 ~' r$ U. X5 Z. D1 [& i# s3 w/ v. z M6 ~ _: _
}( G3 ~& x g4 m4 q
9 e2 x/ f, t8 c! T% h/ ]0 k三、总结; a6 K% s) D* ~
$ H4 _3 l8 Z- ~1 _; p6 t5 U' D
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。9 T0 L4 J- w9 p/ d: @6 N2 X+ q
- O/ _% ?. _8 B& q! F6 j这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
+ ~, ^8 b: V$ g9 `+ O1 D4 i/ G5 _5 C/ W+ u
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。9 R- {3 Y0 Q( a; m0 B8 U4 X2 Z
6 m' D* G; U8 ~; \1 U0 a
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
4 n& L; h/ ^5 m0 e————————————————
7 O0 x" J! h0 C5 T4 J' Q! a版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# c' \+ K8 r; N0 C8 m
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961, p2 J# X/ P. v1 A6 H
2 z( G, G6 M5 V4 w2 X3 L5 k3 e
|
|