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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。; U/ B9 j6 P/ j3 p3 _

" `) p* {: ]7 v# L0 H1 K一、数据插入 - INSERT4 ^% ^4 k- F2 J, Q
' P* |* g2 \# h1 o
1.1 : DLang 插入数据0 ?  |& }% h8 d  [" t

$ a! N5 M2 K2 a+ u5 ~3 A. }; u! ximport std.stdio;! z1 E+ q$ d1 s; r/ B

$ U$ {- D. p" bimport hunt.database;* K8 H6 T8 ]& [
3 c" K  t- J# b2 V# m
void main()
, a- H; n8 D3 y( s7 M: i
4 l( T4 E6 F( g" `) h7 O{) R. m) L) ^. U

. x; F3 j6 ]+ k  v% U5 jauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
( m: P0 f) r8 A% b: U0 \7 l) y  ^2 n" w4 C' d; e8 I
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
3 [$ K& r0 X$ Q2 A
# B7 ]8 h* E% h3 m. C3 {// 打印插入数量
$ f( b* m$ ]& X$ q  x, V0 Z" B3 t" O2 X5 ?4 u! T9 q
writeln(result);
5 J& ^  b) w( J' R6 D: h% e
8 y' y3 i0 ~" q$ |& f$ s8 v2 ddb.close();& d+ V2 H  p$ f' p/ l
6 [# [  f& w$ I+ Z$ B- k; u
}$ T6 d% F- w3 Q6 o+ b& S

$ M$ \+ g& n( c# }1.2 : Rust 插入数据
& c: H, L' @0 H3 |, r2 V5 N3 `8 A& v  z9 k4 U, Q
extern crate postgres;
" h- w1 S* z/ s$ I* ]# |; `8 j" p1 P2 X- b3 Z
use postgres::{Connection, SslMode};
) ~1 f) W" u6 K7 S+ K$ e( O! k
fn main() {( k1 n% _  u5 U: ^

% n5 u" Q$ g, z- Olet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();: y' u, o" t8 l% Z$ s/ @( O

% G/ m! P2 @5 o! l- _! n. jconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
' S$ W' y" n. M' z$ j' m+ ?$ U# x+ v+ X. }' E! a8 q" t7 T
}! C' P& Y: r/ B* E1 }8 W5 s

+ w! v& _% f# d0 [1.3 : Golang 插入数据# M4 O" C: J/ H/ n& M5 u

& J4 Q9 b  U* o  S5 bimport (+ {$ n; e, V- a5 u; g: H' X& Y. D

6 W+ S+ F3 R3 ?# @"database/sql"
! o1 A( a% q* U0 L# w! c9 S1 v! H6 y7 r4 o
"fmt"
9 `3 v+ S$ r6 t" m# u- F' E4 @4 N$ W+ i5 p8 c
_ "github.com/lib/pq", w8 X2 ~2 \, i
9 C4 \  x' P. b( t4 v
"time"" k, A4 W( ]8 l/ R( z8 M
) N8 ?% A! J# V
"log"
. N8 b3 [# o8 P9 ]
$ ~7 \& U% B8 N)6 U5 \( I  X0 o) j: ]
  C1 z4 E# ]9 R$ ~
func main() {2 a! h) v" b; U+ A9 M4 o
* k+ d2 _- h* M' R
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")7 w: v+ @" x4 P+ q

  j6 y6 V4 W" J3 ?8 b0 {4 oif err != nil {
9 \2 |+ S) Y. B) C( O+ e
/ W' ?  u4 d  slog.Fatal(err)9 j7 e9 ~. N% ?' M2 c, V$ |$ w

1 c4 q6 _; U9 l2 W0 Wreturn nil
2 a2 F9 Z8 i: u9 b8 f
/ x6 a: [+ q* d+ P$ m}
# ?- d9 D. P" ?( @3 y( v8 L5 S3 \2 D
" C5 o7 H! T9 gstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
7 O7 T0 C$ L9 f3 ]" |7 d! A& d; N7 O1 S1 g9 c: Q: J  e# K
stmt.Exec()
  K4 E/ E% \" ]4 o9 f% c, F+ A  @+ v/ w9 N5 B. K4 z
stmt.Close()
# k  O' @+ W3 ~& t$ k. l2 h
7 r& c; m8 @" |}0 r& n/ K0 b, [& N# `6 }# x9 l

* B5 g  j3 F4 _5 h8 l: y+ f& p二、数据查询 - SELECT
: n# u, N- k* H  n) K2 Z; |4 [4 D: q* E7 }) f7 ~. o  J
2.1 : DLang 查询数据
) |1 }, |* U( J; I
9 J. G  Q. m1 A$ @import std.stdio;# d0 p2 G. I7 W- d/ K6 W

/ C& ^. A& F( }6 A% Z7 P7 f) Jimport hunt.database;
3 k3 m$ Z8 Q" o0 L; f. [3 B4 Z' p
! e+ C  l6 A4 M1 r9 Q" {# c, m7 v; nvoid main()
3 i& Z# {7 ?6 l" F3 Y( M* _
: I. ~" q7 {9 |{! `: y' D7 u9 e2 O. H

. }, o  {9 s; z, Cauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
7 @5 H: u: M2 J8 q$ ^6 J" y* [8 M3 e2 w4 j
foreach(row; db.query("SELECT * FROM user LIMIT 10"))5 |/ x4 l! h9 z6 d3 n/ Y
5 Y+ q5 N6 |, o* `
{- K9 I+ k/ _9 e4 H3 j

# ~7 S3 R1 G* ~/ E* x* z/ _# cwriteln(row["username"]);" L' z5 z, n  v7 {) v; t* \
# S, l: B# P8 j2 }! Z) W# F
}
+ |7 |; E  ~7 p* C2 T; ~( W! \4 j; b
db.close();
' K5 W6 j: h, p, f+ p% c4 ?- t2 {: n4 M( V
}
% O) C9 i  t4 H7 T, |; X
  I) z+ t0 T# @% u# R2 H2.2 : Rust 查询数据
, g9 r, t7 d% \6 A" H) x4 u
3 R9 H+ o0 K, z5 `, F. }extern crate postgres;" P/ P/ M  K* r. H) X

1 j& `) }* n" [use postgres::{Connection, SslMode};
4 [5 U. u/ v& F  g" m3 W, G$ }
9 ^/ |+ w, V$ z' ofn main() {1 c: @4 R5 D- y1 g- Q
3 I; o  n3 k5 E" p4 T7 l# ~
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
$ I- z2 @; V( ^9 W% R1 B1 n  A6 I
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
9 D; P6 g# Z# {( F
6 g1 p+ f9 A- {( hprintln!("Found person {}", row.get(0));
) O1 q+ ~8 z6 c8 N, @% \3 B7 u; c- O, R% V8 [  Z
}  e2 L: q" R: G

8 T: Y; Q& b* k}
0 Q( T: B4 ~' Y# u
/ e3 ?+ n( N( q8 W2.3 : Golang 查询数据
- f3 z5 f$ Z  L) N0 J0 R
9 ~* X$ z/ ^$ |$ c0 f+ uimport (
; ~. `6 `  F7 }4 q  J1 z9 j/ e9 a3 l0 |+ |
"database/sql"& O1 m5 V6 c( u- J

6 e: z9 d# f* H"fmt"
/ a5 p, ~  t. c6 J4 z' g* e9 B
. L6 \$ N- ~+ D7 f_ "github.com/lib/pq"
* r/ ]% m( u6 J. N( u- D4 [6 g* Q* ]
0 C7 B4 Y5 q" s. h. p"time"
# k) ]8 ^" A  e, Y8 D% I4 N. v% c" P) G  V4 G
"log"4 d4 F# k' \" a0 j
: x3 f, B  T5 ^' b/ g$ X9 \. n
)/ y- s; `7 l) f( t& q% z) a0 F& m
' v$ Z2 J. s( {7 Q
type User struct {' Z7 F/ R3 d  s  G' i2 w" b

, ]+ h, a* H+ {" lUserName string
5 e5 F, G, n; n9 e9 t7 E+ s  _8 |0 H5 ?0 z; Z6 h3 x
}+ C) p( Q5 e& C0 @' N% u9 u* }! m
. W+ u, U/ w' g1 `3 a
func main() {
& ?; u& z1 Q2 Q  [( n% w" }. O! z3 ~
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
' n6 I) x+ m- t' }: ~4 w1 M2 A' X2 V& p- a) V
if err != nil {* y1 E$ V& `' H$ n" v0 F" t
6 V# Y5 b- l) O% M9 p& C) |; W
log.Fatal(err)
% I, a' P! @+ V- [. @/ X
7 p" n) j" K) T1 q8 B) ^" L# x& sreturn nil
, y6 c( x) f3 w' s$ k1 f2 j) |4 m
}* y3 X( P2 V4 c+ B' D
0 k, }4 l6 C1 y4 b8 W
user := User{}: c+ u' o4 H/ H+ h% i

! M( K7 F0 g3 Ostmt := db.Query("SELECT * FROM user")
% N: a# h: I* P8 G* Z% R- N
2 D3 T. ^" G! L. @+ ofor rows.Next() {( @+ U! z- W6 E5 k
1 U$ U+ m! @8 f: `( S2 ?- U5 ^# |
rows.Scan(&user.UserName)! v. d: ~, X! p- {! M/ y
) X" U% X# k" ]9 O6 W' s( r9 V
fmt.Println(user.UserName)
7 l; U( }+ ~8 z* {3 z9 K' p& `+ @9 ]/ ^- |% C2 r+ h3 @
}2 H! F; T* G8 M( X8 Y, i! ?

* ?) L- j( u$ I. ]5 w( ]$ @stmt.Close()+ q5 g5 P2 `/ D" V: H" C

/ r* g$ C& V- q. x5 Q+ R: p$ g8 k}
9 }8 t' m! Q1 A, j1 ?0 W( Z3 `
7 X, J0 g$ P5 h2 Z4 p三、总结: p4 G0 H! w9 i
5 E2 }3 G9 i7 Y7 H
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
2 E4 G/ K! y0 u8 |4 F* V$ d4 E0 N6 e1 @) k, i# d
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)5 w4 c- D4 e* C$ p$ ~
. f" d6 i! b7 T) l) \
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。- ?* L; p, c3 N0 h, ]
6 z/ e9 r3 q5 Q3 O% o, _
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。6 g4 s1 J1 X! k+ `' P' y
————————————————! B2 P5 ^/ ~' o( N) E
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 ?* J# X' b0 J& a  ~原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961  c) A! X1 q8 n3 s* s; f
7 {: a3 s* `6 S1 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 20:20 , Processed in 0.107832 second(s), 19 queries .

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