cncml手绘网

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

作者: admin    时间: 2022-10-26 00:48
标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
# p7 x) z* g0 M+ V# u( u" A. _: P" K$ B3 l" C
一、数据插入 - INSERT9 K# J- m3 P! S

6 s, D% N/ X3 i  T: n1.1 : DLang 插入数据
, s+ d6 Q# c: D. j4 v$ }7 ?
4 \5 G, r& K1 }, ]7 `2 `import std.stdio;
! o( ]' ?: u4 Y' T' F1 [2 Q# v7 R
import hunt.database;
5 ?) a" B7 e( c7 ?; ~/ p& Q( d, O1 W1 k" [
void main()
3 g2 H6 R. d/ N% F! K4 H) Z
/ ^0 ]/ z, j7 }0 ^/ _' s" Q7 B2 H{
% P% p: J, M9 N: d% G
' R! |5 K  a  |/ {6 a- Dauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
( j5 h( @1 f) v* s2 k% O! b2 _- |7 }0 I1 |! G8 ~; q
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
  g5 f( W& I% a3 \) [
. O+ H, f5 T# @7 P. D9 E$ E- c6 l& }// 打印插入数量. e1 e3 r2 K: {$ }

7 Y( B3 B; v3 z1 `* a  N8 @writeln(result);
9 Q7 ^7 Z- S, X- C( ]$ d( @' D; u0 i9 e7 ~0 n
db.close();+ k3 p4 c+ I1 D/ @

5 p8 P# G- {$ M/ \}
! r  Q( K) X& ?: B: E, B, T
" b& e  J' J. n8 I# f* j3 P1.2 : Rust 插入数据' c. Q8 l1 k4 u$ v! O( n& r
, t' a! v( K4 t2 v% n6 J" }
extern crate postgres;
; C% X# G9 |0 j) e. |# O, m* J9 P% e. y! ~9 E, G
use postgres::{Connection, SslMode};
1 v  s- n# D  [$ H/ ^) d" t# |3 |+ w1 o! a# k; t6 n6 N
fn main() {
  g  k+ q# c. ]" C
* l/ `7 g% f5 Q# r5 d2 olet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
: t' ~3 n' r& a* e9 b1 J9 o: |- x. A( O9 b0 k
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();; U2 u2 T" p- o0 P) s9 J- T* i6 I
- b# u1 U- p$ J- E" J# j
}
5 F4 T( A, x( I0 R) z  V. b3 q
# O4 b- W! Q( h4 r2 E! g' x5 E1.3 : Golang 插入数据
7 x: C! f) E  Y+ c' v
# j  k/ L" m: Y8 kimport (. M* D9 ~  d1 t" d! _0 U

& V% o0 ?" ?# t6 R* t. E"database/sql"9 k8 L+ d- v- Q% Q

  y2 h% _0 P# \6 j6 u"fmt"
( ?: l3 S7 j( W3 W8 H3 z
. T& J" f8 S9 R_ "github.com/lib/pq"
% I: Y; Y+ p" l# Y3 h; K( G( W. x
- J, m  u+ ~6 s( I"time"
2 ?# k5 h2 R2 ]; ~9 J9 B* {+ {9 }" U! g. d* n
"log"5 N" i6 |: y) [. r1 U# P7 U

) Z  k* d2 S1 n7 g. k)
8 c$ i% U& E# {
4 b  f5 ^( w9 `/ o: V8 nfunc main() {
* E. S+ a6 F) ^; E  V0 b' o1 q5 K  }. y" }6 R6 E  m
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
, M  R( J! x& l7 O5 x0 z  t% x4 u# u  m2 T1 r% u$ I/ `
if err != nil {: g0 ^8 a; B4 ~2 w
! `, y( m4 G! C( ?# x+ `
log.Fatal(err)
* q: B7 B% @* r- J- {( V5 n) K- a; i
return nil
) U" v$ X; c& h. {! q, ~$ ^  O$ M/ K1 X0 G. `
}; b1 q0 ?" T* e% @7 L& m$ |
% J+ j/ U# b) t
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")"). Y, ?; t, Q; \  E7 X+ S

' U  f) c5 P( D. Z, W; V$ F2 ostmt.Exec()
% Y# |+ \! M$ ~" M1 a. i1 k* h7 V% g; r( n
stmt.Close()+ L3 P  _/ K) x4 E5 n  u
: e/ W2 ^* x' w! o& z
}
3 |, G7 }( p7 L' H  V: Q& S
; ^' r- e% P$ p8 r3 S9 \( e二、数据查询 - SELECT7 Z6 f0 s6 p2 r( D

; j! g" [8 V: v* }: A2.1 : DLang 查询数据
! H+ ^3 H6 R9 Z, j7 ?+ e: w# w/ P+ O( z9 n7 F4 b8 E
import std.stdio;
9 ], `2 {3 }5 I; k  y7 l% `3 ]- D: h9 l" E/ ^3 ?% L' C1 L
import hunt.database;
; a+ {. ?7 c3 [2 }" I3 |
  P$ l. h- ~& }5 ?+ Y; fvoid main()7 t& v5 i4 q# T5 u0 T9 u

; X4 U4 `, g) C- L5 `5 P{
9 z0 b1 o3 S) X. d8 t- r3 K* @& {4 L9 e# u/ c  h1 P  y
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
+ H; P$ r: ^! B
- p  E8 P3 w$ d% Rforeach(row; db.query("SELECT * FROM user LIMIT 10"))
! K. Q, J4 C" V6 X9 b6 g8 p2 v: S
7 \. Q, ~4 \% Q) f{
0 k* t( a9 }' b7 {8 ?1 J# I& ~% X
writeln(row["username"]);
/ X8 f2 ?1 s2 c* w" s5 s  U: M$ ^- K4 u0 o$ k9 ~
}# R5 H: T5 K* o9 n

7 R6 \  @1 ]: i9 Q5 Kdb.close();/ V/ Q6 k9 |2 |
% u  g" K- f* r3 h
}
: N5 |5 e9 b. |$ d3 h
, P$ ^8 \6 @" ^+ R* M. w2.2 : Rust 查询数据
, M6 q. n9 ?. A3 M/ r2 V' e4 l. S# x+ Q4 l( o. T( m1 N/ Y: [
extern crate postgres;
0 y% r. m, D# A$ G* T" S$ T5 N! T, v4 B# B' h7 N" L
use postgres::{Connection, SslMode};9 `, V5 I+ N; t& |' Q
. I8 |1 W  m9 n2 ^2 v8 W# C
fn main() {
: n; S2 c$ t  \! T, S0 K$ }3 ~4 x4 C. \5 u) D
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();7 a7 m: M! Q& v# w5 I  o

4 Z4 ~, d/ O- Nfor row in &conn.query("SELECT * FROM user", &[]).unwrap();0 k- R% y' [) P7 J/ O
4 p: w" L. C( j8 V- |+ h
println!("Found person {}", row.get(0));  z6 E: _& ~/ @& @0 D, g, U
- {9 s( x' E; D: e6 e4 _9 u
}
% f. F' X4 ~5 \) \. w& C+ K2 Q( Z6 n; E- ]' X
}
4 _3 D& y# o. `7 y' w% S- y5 N4 Y# t
& X" g+ F) U% e4 Q2.3 : Golang 查询数据
# N, E* X2 W9 K& o9 E2 C0 a6 Z$ }+ m! W" Y- @( V; `, j
import (* E5 `' |; A- z: U4 c2 v

9 [/ n) j9 A6 I"database/sql"
/ t6 d6 q$ b! T* R
: x3 E; P% z2 y" ["fmt"6 r/ ~( X6 d; d* c# J9 i

! M1 \( G& x- b! L_ "github.com/lib/pq"' G" s8 F' I1 M
" f0 C- S0 e) l1 p' w
"time"2 M8 h& N4 t( J6 t
$ ~0 N; V* w7 f& b! o" A1 |/ c" m
"log"4 Q3 X6 O0 j9 @/ n, a" g( p! S/ v
- s+ P3 K5 R4 |  L. X" U
)2 l* h! ]4 C2 Y* Q8 w& R! ]# Q
; n" n0 S0 N& ]; F
type User struct {
$ v) o$ V" J% t7 [5 w& q1 h
1 M0 ^8 x- H0 [" G6 S1 J3 gUserName string
. I0 {; Z3 x2 X" D5 C- z' p  G2 |
* K4 c0 @4 {; c& B; s2 |0 O; n  _}. _- H5 V  g. M; q7 h

6 B. m6 s2 i$ s& rfunc main() {) R- S/ m) c; Q  _: T

9 b7 g/ n# |* j2 q) |9 Idb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
* L& r  y+ D6 J$ a' B3 g+ x2 Y" s8 ?! \
if err != nil {" N- o4 \6 j/ G% D

! m9 |$ T% x! _+ o* F: ?8 d, Xlog.Fatal(err)
0 Y  R2 F* ?9 A8 w% X' E7 h8 Q! ?2 [6 \, A4 _# o$ K' N: a
return nil
( l  B) M2 d" W4 i! z) h$ Z1 D1 X6 Q2 p: z. v! Q2 y* K
}
/ U- X9 O9 l# `# y1 A; C- G7 J( k' y; Q, c3 e7 o2 n5 c  }
user := User{}
; C/ l& |+ G, l$ M" `2 X
3 d- \1 o3 v) S% pstmt := db.Query("SELECT * FROM user")
8 K* z9 F9 ~3 y. u3 F6 d& u
) P1 k. V& p  b3 A( Yfor rows.Next() {
7 O) a* h& C+ x1 K
% D/ i& o6 _9 ^, d/ C. ?rows.Scan(&user.UserName)# s& q- f+ [- z" n
+ I4 S' m6 B7 ~, s  O9 `+ M+ ~" H
fmt.Println(user.UserName), L. Y7 b. K0 W8 }. a
6 \& V+ Y% _9 M
}+ J4 h' U9 d1 H$ c* _! v0 M  t1 Z

+ U4 K- a8 I; R, Zstmt.Close()$ j. {7 ]6 w+ q8 w& Y3 U

: t& t8 @3 N' E0 b+ n9 J- g: [0 S}! b( f! D7 p& V3 h! h
; t& U! h2 B  J4 b, @# L
三、总结
+ `# r7 n' ]& m6 o3 @9 o
* f0 k* T: a3 d$ f5 \对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
, D3 [6 U! r7 O$ h( p& l, p7 \! k/ O
5 |9 R: @( h% d8 b1 ?这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
8 x1 G! n$ z8 l2 _5 P
8 U$ |8 Q; s1 M在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
; p1 |% G0 N: G' f6 e2 e( M# A) d* S& x$ }% e- s: d
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
4 c& n/ q" ~4 n5 F6 \* o————————————————
# t' D# K) b2 ~8 U版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& q1 g/ f* V. @# R/ c4 e; `
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961) G" R1 h" L. y- P/ ]1 o) x6 M9 C8 C
, y. X6 l/ a2 l0 x





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