您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2124|回复: 0
打印 上一主题 下一主题

[rust] rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
$ H! Q7 a" c: W% z0 d5 I# G/ A  A, \2 g7 ?  a' M% P; `
一、数据插入 - INSERT
, R' ~* P0 Q; G/ {" e. A4 k7 q8 J; J" }' H1 \3 h+ p" V
1.1 : DLang 插入数据
7 f- H( g- e0 u( n1 X0 T/ }8 Q+ s
  ?5 w3 ^' O% eimport std.stdio;* [. H8 D* y; a* O

1 o2 s" p/ o' g8 bimport hunt.database;
3 D  }  `( }! ]8 v  B
  {9 t6 D3 j( p1 Avoid main(); Y" l, M* w8 N7 `" n* i* m

- j" y/ u2 e9 z* f5 J$ T6 L- Y{
3 y4 c9 K  ]- r3 Q9 k- B2 C) V+ h3 F
% V  I- ^" k3 Jauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");- U6 ?# G' o" V, {: W
2 m% ]6 \* h- i( H& |! C, O! }+ ?2 X+ M
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);5 D- ?2 q7 J  ?5 h' u
  ]8 c) V" G4 ^# B5 p
// 打印插入数量
# m' i+ i+ }; L" U1 L) O; j$ b2 @9 m0 ^" `* N, Q
writeln(result);
2 H! x# ^/ I! Q+ j$ \
0 b. M6 J+ `2 X; |0 s# }db.close();; C6 z! E$ {) r+ U1 a3 P) B) \
# X/ g: B% y1 t" W9 j; l
}! S. _  S% O8 f& t$ o" H. J

; N% O1 |8 o5 {) k1.2 : Rust 插入数据
" h  V; x6 m4 E! u! S
8 T! f" Q" p; k5 Jextern crate postgres;, [4 ~+ N* ?# K% X  ?1 @! {0 M9 V

  h3 Q9 O5 z9 B% Q; \use postgres::{Connection, SslMode};
. A% f8 N. V0 C& n. u9 q
, m6 i3 L& N" q" E7 _$ o" nfn main() {
! u0 v& v% @+ ^6 M) v1 D/ i  t# Q" e( f5 |( R
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
/ z! a" ^& _1 N9 i9 n- e$ _# Z* w( T
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
7 p& b' w% l: G2 Z; t  y
/ L5 D. H* |% C. v}
0 n) u- n- ~' M  `1 @2 f5 }% }7 U7 R  k2 K8 x
1.3 : Golang 插入数据7 f$ E3 u8 r( C3 ~# ]' H
! a- i6 r. j0 ?2 j/ _
import (
8 T6 }# ^6 Y% ?6 U1 l
: z  l8 d- S# M- Z"database/sql"* Z" K- A& p) Y8 M1 i: f
/ g- B* T2 v: w" |( M
"fmt"% ]7 \% s# x) Q- g1 O
2 {& V. t8 P" r0 P, z" y. \( J
_ "github.com/lib/pq"
  d" _( \. w3 B5 _
+ ^% c  k) u- A5 R8 K( C"time"* b8 U( A/ P! S
$ b7 s' g( V. W' g$ B5 Z
"log"* S- a% D& t7 w- e* J3 w

) I+ |4 {' h! r/ r0 G& o)
( h/ F% I! e7 b- Y7 V# R+ X& I' T& L( c' q
func main() {
$ T& T2 }/ k/ t1 b
* R* p% V. L7 g( E& M. rdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
- ?4 M7 d/ ]* T; Z4 t. A- H" i8 A
+ x  T& d& X& @7 qif err != nil {
# \5 {% o+ o# Y- S' c) v$ F1 B6 U, K$ v7 H; Q# S: Q, g9 c  l
log.Fatal(err)0 m, Q$ s. n6 J3 }! k
3 G+ N: f$ y( |5 l7 i5 ?$ H' a
return nil) z$ \' }! J/ |* j5 ^' i  [
4 ]' `0 G  o! E6 i
}
8 |' D# e/ Q3 G8 j
" m# T! [) t4 _- xstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
2 i1 t( b1 }& d% e3 s
2 g/ k% |- I1 i& |* bstmt.Exec()- J3 i4 y5 e/ G* O4 k

, J& R% w2 w( U& b. `stmt.Close()
5 |+ |7 N: P2 S0 P. g! g8 y3 E, n, M7 Z4 n
}8 g& Y) m1 K* B! Z
( Y. o) a  p' c& t. L
二、数据查询 - SELECT6 W1 b' B5 s" f8 i

, t( r+ e' m" T/ ~2.1 : DLang 查询数据
1 j! ~, ?( B. h3 P/ y' q' O+ G: K! H$ X8 D2 g6 O) Q6 E
import std.stdio;1 R$ K0 k3 [- E8 R" ]! M$ Y+ v
% a+ z- I+ \2 v5 G7 h  v) D2 X/ T3 ?
import hunt.database;
% {% \( s+ k$ v' }) q& e& [, m9 a' w/ D- U
void main()" R' f; o! T5 Z4 ^

7 I/ [" p* x0 s{
6 `' J7 g4 l' |
7 u% W8 q" Z" p" m% Bauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
! Q/ C+ B6 j( B: k6 X1 J; S, ?& [; C7 J, A
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
$ ^% _+ Y+ _( }- p* q1 l8 l, k9 f0 V
{
$ x, H# H1 t: [' u1 e: T/ |5 D! I
' U  E' \9 W4 J2 k  M- Y* cwriteln(row["username"]);
7 a) P2 f6 k9 d; a) U
' `3 i, x( o- o. U/ I: a( I7 Z}% w- Z1 o: f! N8 I5 f( A1 Q
0 o7 t8 R8 \, u7 r, _: R
db.close();
- i( w; p# U: G% ]$ ]+ F
- @% C' A( e$ B}
* ]- y* k, `$ s) D7 I% O! V
$ A$ J# q2 g. Y2 P$ |6 q2.2 : Rust 查询数据1 [: P( {0 O+ z1 I7 ^2 L

' g% O- R; ~4 k4 E3 [1 Cextern crate postgres;
1 M  V" F( S. ]" x7 O3 b) o
- j* f  |9 H$ \0 `# W- {. ?use postgres::{Connection, SslMode};
0 u( Y  R  ^+ f# _9 ?% D6 Z) ~
; q0 x; I, Y$ `  D- C$ Dfn main() {1 G* s3 B6 _' C! A. r( v0 R

* q& F! n8 q, C, qlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();, Q7 d4 M& b  S- R
& v3 g! ]  C- x+ B$ {
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
4 b& z8 z% ~, ~+ ^3 J5 Y& G$ n. w7 z
println!("Found person {}", row.get(0));0 p* c; \" Q3 ]3 S
( `5 y8 t* @& d/ k  V
}& f# [9 O: v4 [. Q4 j  P
! q, a* N' t) `5 u( J8 x
}
/ Z: }+ ^1 q/ p2 c
5 ^2 u/ W) @6 I7 h3 s* K2.3 : Golang 查询数据
$ g) v- j/ g3 M4 O/ Z  f
* C. O  J0 ~7 O& H4 Qimport (: }3 m8 i7 r: e  R
: Y) K5 p! n+ f+ ~6 D$ \
"database/sql"
1 F- l3 E& N% s1 @% u8 R1 P( p* H
: l* l- V) ~* A  j) y"fmt". l: g  P1 c$ `! r# h9 [3 V3 m

- _6 g  E9 l& r# P, ?_ "github.com/lib/pq"* x- t, d' S6 M
4 e" p3 }& k. e' z
"time"" q0 E6 r2 M: F7 l

) w3 Q+ ^, `8 b"log"
& h( A8 D# O, i  ^3 T6 w! {; M+ e( l8 W
)
) X# S0 b3 A. N0 ^. \! H( M# Z0 ~! C) t& _1 h2 e" Z) ]8 [' F
type User struct {( h  y% M) _4 Y! }# `! Z

& [* j( B' g) dUserName string- D4 d# a8 i  V5 d

; C& I# ]9 E0 v0 q% {  g+ i6 a}
; \: K! N; |) @9 X8 a' g3 q) j4 D3 [
func main() {
" m' O% J4 i! [( n0 _5 \2 v: M( t8 j& s
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
5 z. t" i+ j. T6 b; i: U6 k2 A, d$ D5 C% k' m7 b. }
if err != nil {
, b5 X. n5 ?2 d! i+ a0 P# c& ]5 X  Q/ u  D
log.Fatal(err)' g, ^& q0 y- l. m
/ b; _/ J1 Y; |% }7 e* [) q
return nil2 u" J) W- w/ p3 P6 G
! C8 O/ ^7 w: l8 L
}* E3 B# C! N9 s3 g1 `
! L& d1 @; g5 H. z* I
user := User{}" v3 {& d8 v% S1 g  @1 X: w

7 z: v+ ~+ D9 T: X8 Estmt := db.Query("SELECT * FROM user")9 f7 w( A5 R4 k: B$ S5 |
3 N( Z% n) r$ t6 v% i
for rows.Next() {* P. O: Y4 G. j& U

! Z" V9 Q; U2 ^0 x/ e3 Trows.Scan(&user.UserName)
7 t0 b7 Y' p5 @+ Z. M8 A1 g+ P6 _
fmt.Println(user.UserName)/ m, c8 x) M0 ?- Y, \; q3 s) r

' H) N9 `; q6 ?/ x}
" X+ ^% P! A5 j5 {4 b
, M2 _8 C7 [* L. sstmt.Close()4 x# V, h$ F6 e+ D  O

! Y2 {8 G' }/ Y9 e/ {) n% Y9 f}
* _6 N4 z3 y, c" e% b
7 {* h% ]  m% |" O) F& t$ @6 m7 L; Q三、总结" {# C; p# y9 t7 |4 }2 J5 q' Z
+ V( m/ q( q) m% j0 l1 ]4 S8 u( P
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。: }( d/ W2 Y7 V" E$ E1 G' F

3 v3 T) ?0 C- h, v. U4 h这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
% G0 Y1 l  P4 A6 X6 ^3 x; P
  y( _4 H% Z$ K1 K1 A在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。0 U* Y6 l. _, \* B2 r. q

' ?8 H( w) a5 v; l/ I总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。! ?/ A# b/ n" L) E  Q2 }
————————————————+ n$ j; Y, r8 w- _  V" Y) M
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. ^+ `" o* c1 Y/ S3 i/ ~  W原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339615 Y! |' y4 f& n2 o

% ~9 H$ Y! x) Q0 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-3 16:58 , Processed in 0.113149 second(s), 19 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!