cncml手绘网

标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式 [打印本页]

作者: admin    时间: 2022-10-26 00:48
标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。: @" S# `2 I  W" b
8 E6 w& `5 F  O( ~) f( F
一、数据插入 - INSERT
2 V/ D$ K' m) [8 |, B+ k2 N3 f" R# p) Z0 ^0 b" H
1.1 : DLang 插入数据
8 u& O+ S/ G  B; s  J
, P5 R# V6 y- g# K( f" Iimport std.stdio;
3 Y' Q0 \7 E/ s9 ^: ~+ M& E* N2 ~, I, x) a! ]0 q
import hunt.database;4 |" ?  i8 z5 @7 S: r+ T6 i, D9 h

) _0 T2 c" u+ {1 J$ j# n$ zvoid main()
0 {5 H' I$ Q; O( D1 a$ P; Q% d% T: D2 ]2 I6 h4 |
{; ^0 K$ c" V3 O$ C
1 A. A5 Q0 l3 q+ Z
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");; ~5 p5 Q6 Z- q9 z1 U( a, Q

+ l! J% {9 ]1 K/ |  z  ~int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
5 z$ p" E' j% f# D7 V! P, \' |
2 w3 i9 |" I+ i' _: p4 t// 打印插入数量6 g$ x$ a2 _! Z
3 G# Z: r. e2 C4 [" Z- p
writeln(result);
$ G4 J5 o, i( I1 d% ~
" b1 X2 J& H  Y$ `% _  Gdb.close();; L% ~' p; ]) v

4 V; c+ y0 _. B- ?: {5 f% w+ }1 c}+ h& I! G8 M- P' @9 f, J

! m4 \  O: C* R5 {1.2 : Rust 插入数据) T$ }) C- `2 m( O! l" e
# e0 H3 u% s; O% @( C; c* B( g" g) i
extern crate postgres;
1 [4 z4 F2 z3 X4 L2 _
7 H0 B* a8 O' b# a6 x+ d! N; Iuse postgres::{Connection, SslMode};( ?; t* n5 O8 m/ c- I6 u6 y
- b  D; Y7 F- f5 E/ v) J
fn main() {& w$ n1 [. Y6 N4 u

; O/ I" M* z, o, Clet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();  L1 F; t3 _. N
0 O; q5 d2 t, e0 D- U
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
3 h! p) @( V) v( Z7 \4 \9 [& S8 Q/ R/ o! B  {6 T- L
}
. }$ O2 _. W- P! r- g, ?: V7 e- v3 G$ `
1.3 : Golang 插入数据# Y9 P4 c2 a, w
8 @! K& f/ G- `) e4 ?6 ^5 F9 o$ v  @: h
import (8 j) }6 X) v/ v  I2 y

1 f% @! A$ V! s8 c; K& L3 n"database/sql"
7 P3 ^* {: F) T. m+ ]2 f: [
" a1 ~& D# ~9 n# X. O& |: W) _- W"fmt"
! z. h; L- F2 y6 t% V1 S, a$ D5 V; A# U
_ "github.com/lib/pq"' ]/ ]1 I7 p5 g0 J: n

6 i: Y9 N  P' ^. Y+ }1 u% f"time"
, U6 v6 M! R  N4 U" m2 X$ Z8 a2 f+ ^/ l+ F
"log"" a% C$ {' {2 |. d- {: K1 `. c5 C
5 n0 X6 W, [7 R. ]9 x0 s! E
)
5 f" e9 D2 ~6 F2 ?# z# Y7 s1 l3 }0 C! d
func main() {
) R7 W! d8 N5 b4 N" \
/ C8 ~5 F% w. H% ?0 F. Edb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")& {% t+ `, @8 X7 _6 S

, p! u6 z) e5 x7 Z+ kif err != nil {' b$ K4 V1 S, z7 q6 L9 P
7 t9 ^$ v, e$ v
log.Fatal(err)6 \  t+ q0 ?% v  o
1 E( d$ ]0 @8 U* [9 d5 s
return nil, O( }6 q4 ?* G

% v, \5 o' C0 c9 `, F}
' i+ g( q/ T/ q) p( b3 C7 ]' y0 Q, k$ P6 u
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
: ]7 m( e6 ^& p; p" o- _8 N; Y5 K9 e( X( i
stmt.Exec()2 X, ]7 u$ H2 A5 q; l
8 A: G. d+ \" m3 X% c. x
stmt.Close()
# R& a2 J2 q% i
1 f+ v+ J8 ]! S}8 V+ }7 j! A0 C  Z1 ^5 ^

* j2 v7 p$ _( S/ z6 R; I3 {- @二、数据查询 - SELECT
$ z: r) D; ]% E7 b4 G1 V
1 d2 U4 f0 T$ K  s/ u2.1 : DLang 查询数据
/ ^' i, T0 P. X. d2 @
8 v8 S) r7 L8 O" n# Himport std.stdio;% H' j  s5 c8 n2 @

* L' j& k4 V# ^. ]import hunt.database;
( D) B! ]* G# B: d/ \1 M6 |  ~# [" b
void main()( K8 Z: Y1 z# z

& A. t) R! j- n+ ~+ A0 ^. z# i{0 a& u; j: a8 F

. C! T6 w- U+ N: Lauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
# M6 R+ c. X# ]& o1 x
! c. H) c, K6 S: Cforeach(row; db.query("SELECT * FROM user LIMIT 10"))
1 A- ~* s2 A- ?4 S" ~
& ?5 _/ B6 F, e% V{
8 F" A* R  r) u# e* x# G
- H- [) B& V, v9 M1 E) }writeln(row["username"]);! V2 g- {# p1 d- k

9 b8 H4 e0 n  K, _+ M}
% b: S$ r! @* q% S
$ B. L# n1 n1 kdb.close();* ^* {: p5 e1 p1 I8 ^

  J% v  z* ]0 ?4 a  }% W}
; G; I4 p9 W  K' k+ Z2 K
5 b! R* q" R) ~$ S2 x3 I" m$ u" q2.2 : Rust 查询数据
$ J. d8 g/ Z8 p! G& n
1 U% W9 [1 o6 M/ Pextern crate postgres;
0 s# g: v; `+ i% s! }  y) k3 P1 L4 d& H% e
use postgres::{Connection, SslMode};
2 o, f7 O' j& Q7 k
4 ]' {2 k) I: i: U, h8 p6 a: ^" _fn main() {7 D5 m" _6 {' L* B5 }
1 `/ ^: Z8 G0 B: v4 K. J
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();- u/ h. o  ]( n' j  F# \1 l. H

" H- `& f3 W9 @) f, R3 bfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
7 w8 w2 d3 l5 q. k% q
1 ], ~3 t5 e/ U& _1 }- tprintln!("Found person {}", row.get(0));
/ L: @- c: b, r- L7 H5 y, J! {4 F  T7 o& B
}
2 H8 L% x* C3 ?
' R- Z6 V) f7 r: |8 q3 B# t/ F}
/ h6 H! d3 s5 p* e$ ~$ d! A
+ ^1 Y) X, ?6 z2 R2.3 : Golang 查询数据
8 I+ }& s& z. f2 _: i, H) T  {8 [; [" P7 ?
import (
6 ~# {  ~5 E# B& S3 g9 C0 X# t' }* H+ D" x' C
"database/sql"/ F% v9 n1 z8 J1 y3 Y

9 e- v4 ]6 ~: W+ Z/ m7 y% E"fmt") @' m! Z8 z" X* h
: }6 W3 t2 `  Z0 I
_ "github.com/lib/pq"
$ c1 ^& v7 w0 ~$ x4 F# g/ q' O. A' d  J+ F
"time"8 {: ^7 R# F1 t" U" s. U% i1 k
' D* H& N  |; b( d; n
"log"' [' l6 N1 L. \( `
9 _& f/ ?# g% C5 [1 n2 m/ B1 F; S7 ?
)
$ A1 o) u4 a# [+ n+ F, U2 {: `
4 S4 E  Q* j2 N  h% itype User struct {
. M; A. ]  q" P% t! j7 ]
/ n/ ?" F  M* D( ^  Q/ w/ D* q% HUserName string* D0 w4 C% Y* l, S
/ Q. i( p  o( i+ T# F1 x2 g
}
* {1 f% |8 I. ~. @# U
+ a! r' _  W: m7 s/ S  Cfunc main() {* y4 z5 b5 c  F7 t1 n
* Q2 Z2 m( O/ ?. o, {( o6 K" o2 ~
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")3 q9 T' q2 m, `1 Z* b
2 Z1 F+ E9 Y- K6 X# j; J1 {& W
if err != nil {. E1 n. E- @9 _8 J7 s- \
! B: `" _3 o' |9 _5 e& E3 u: I
log.Fatal(err)
$ |3 a/ G, y- }' T0 h9 c# t0 m! s
return nil
/ K9 C7 \, Z% V) K/ i4 w5 N6 V7 ^* v! c
}1 p5 L  P' z: Z3 l# @
+ h: x" P  Z( [  z% x
user := User{}
$ Y  T6 L$ v7 F- x' _2 Z$ \1 ?/ m0 f. F0 f  f  o- R
stmt := db.Query("SELECT * FROM user")
0 |# V' o( [# v$ G
* h3 w% O7 q2 o+ T3 K# Tfor rows.Next() {' |  u0 I7 `' ~4 f3 z! b3 ^
/ H. v3 a9 D  z! q7 j0 i/ N
rows.Scan(&user.UserName)
& ~1 N- ~$ \. B/ {6 ~( L
% e! o% A1 R! rfmt.Println(user.UserName)- S) B6 Z- ?# a9 P! v6 b" ]
8 v2 Q/ Q2 \" ~  C+ W; S' i, c
}
/ c; a0 |0 z' |5 B$ O: f" q3 ~( g4 w# Y9 I% l; y
stmt.Close()
7 u2 D* o* O6 s% a: X6 v
+ i" a% a% j" G4 a}7 y  H% J& x! q* j# I8 q

5 _# k4 U7 t# t三、总结. w1 x6 v. g0 u; V" v3 G6 z7 U
! O) Q# |* W) d$ M1 _
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
" c- N' V4 o( q+ S( u/ L' N, y# S$ w6 w
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
& L& X  o$ i( {; w/ `! N
/ Q1 b9 U2 s! o, c' J在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
5 s6 H6 Q! F! `) v+ x* u1 x
0 }! f3 A5 N! H7 X/ L总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
& U0 Z) A  r: p5 N————————————————
7 Z8 q* f% _) ~版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% {9 I0 v5 Z0 m- H% G  ^
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
; R3 F+ Q) T' L5 R" `: D& l9 S$ R4 V0 W& y% k





欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2