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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。: V6 B( o8 H' J6 b
. `' M- `- O5 ^- K0 l3 Y
一、数据插入 - INSERT* v4 F8 z) d; w/ o0 _' H
- m2 B/ Z# N3 K
1.1 : DLang 插入数据% d! M5 n7 S' D0 a5 x8 A+ ?
2 ]: Q% c+ p# K( V+ h
import std.stdio;
5 i4 j" J, T. }- ]$ o$ w
$ I- N3 t" A  w* W8 Pimport hunt.database;
/ I: ^3 N. P0 ?- V. h% K, N" f0 }+ |* Q0 s
void main()  k, f, w) ^; t9 \/ l/ ~+ m

" S( {! g1 ?" h% ^{
+ ^/ ]+ G1 f( @" A1 d1 o. @$ W; {! [
' M, g8 v- h' D9 W" ~- xauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");' v& m2 S7 q$ ]8 A

, D9 w6 g7 |! Nint result = db.execute(`INSERT INTO user(username) VALUES("test")`);4 g$ \. Q2 \$ M) U7 q
  u' T9 y- K% P, A: b
// 打印插入数量
9 j7 }2 M8 g0 A% W* ]) p- v9 \7 b1 ^# k; k- }1 z8 F; z
writeln(result);
3 k" w" @( F* l# Z$ P& Q7 b* u! q- O0 B% _1 U  B4 Y; c" ?2 J
db.close();) a: [& S' X0 d4 w
& G2 K, f# f5 b
}
7 P5 `: p3 S  l( [' {6 K4 k7 W3 `- r8 a  \
1.2 : Rust 插入数据
" p% B0 H8 O8 e& N( f( c8 n( F5 d) A9 u# {
extern crate postgres;
- R3 k1 u% M2 w% {; M9 c9 _
7 q: H7 G1 D2 {6 puse postgres::{Connection, SslMode};
# m. d1 A7 _6 d$ R4 \9 |3 Y) p) J: k
( t& H( L- r7 [fn main() {
; Q/ v; x1 p6 X, Z( {0 _
8 F# g  M& J. t9 ulet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();, M+ w6 H; e  T1 {
6 U- D: q" F. N- L, j* M, q# L
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();: Q9 W* i8 {9 ?+ J3 T

1 F% Z: j1 H% e9 T' ~' S3 ]}
' [$ M" c, N' t! {; N% \2 a8 z8 U& u) ]6 A
1.3 : Golang 插入数据
& k  |& s; z6 I$ q; m( _( j* e# ]
* O( U. t8 H. c. I" ]import (
7 o- {- W/ c+ V. k0 M! R
( Z% |! B, _7 B/ [' f4 Z"database/sql"
' @3 n) h. O4 d* V8 x) N6 m3 Y% H$ \
: R7 }- n0 A! c8 Q"fmt"
5 n) f9 H+ h0 z8 p7 s
: o& v4 G+ y' i3 N# ?4 f_ "github.com/lib/pq"
; _/ J, E) ?/ y
2 q) f7 t. D9 i; d" y"time"% d6 S7 U9 i3 D: Q7 H5 U

( ]9 o5 z5 B0 W1 k+ t' Y! {"log"
1 `/ P2 v! P0 T6 d
, o+ V9 |9 h/ N6 `' n1 J' r); f+ m2 q( M, w1 j4 j! a7 n! A

+ Z: C' j% y0 G: q8 @func main() {1 H9 O/ |2 k9 c" I* {1 x/ u
' Q' n, B4 i( z1 c( T) A
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
6 A! G6 s2 t- E" ~! F% ?( d: T
% d) \! E5 z# @4 [, w& ]if err != nil {
2 F* l. t8 E3 A( A
& [& L1 T! r) R% W& }0 Dlog.Fatal(err)
5 K) A* v. n( Y- c
9 F( h% U9 J$ _5 J- L9 d& freturn nil
! s5 v, W/ P6 N4 x/ [8 n* u( {4 _
' F( K2 C% y7 ~- n}
4 X0 V& t1 i9 ]( B  y9 X- z- G  u$ N' e9 W6 |8 o. E$ n
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
1 T9 L$ _6 R/ Q4 Y3 `+ v. p7 `* ]$ M9 T
stmt.Exec()2 |' \& [1 ^" N
2 R2 n, o6 I% d! @' K* Z% \
stmt.Close()  q3 ?. n, \% e' V4 _$ W

& r7 N$ q4 u, \' ?}9 l& }0 @1 T/ [# `2 u9 v7 k

+ N% ]" t, B8 t$ D5 x8 f* V' n) A$ F二、数据查询 - SELECT
# B  \0 I/ _/ g4 R2 x% e% ^; r
' A; K; m6 x3 T; U+ W6 K5 n: V2.1 : DLang 查询数据
" i; ?& Q2 ]3 S3 [$ |9 k& l5 B$ l
. T2 n9 w: M! P8 h$ \import std.stdio;
6 D. l; q  I4 G
* i, J9 g! G" q) }/ s/ j2 ^import hunt.database;
" L( I$ V/ l. O6 ?5 }9 M1 f& `4 o: c* C9 g6 z
void main()3 {( j! W: B0 \; \# q* C" Q# z
& i1 d' f. P, [+ ~
{
4 U7 O7 e  f+ w1 U9 Y# G0 U  C3 }  y' P1 {0 ?2 G3 n; V
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");8 l: E* k3 V2 o! x$ M
! Y* U9 I- S( o5 l: \% X7 E% Q8 A
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
  f6 [/ O0 P8 t- o' ^& q2 [- T% c2 E% X0 O# y* a9 y% H
{0 N; X& k) f0 m# o# p- n

5 Z8 p, H- k  S* iwriteln(row["username"]);
, V9 k# n) `9 R9 r2 t6 X6 Q! L( l' R
$ f" Y1 }- j4 L$ m4 }: j1 D+ i}  r' R% E# X8 ]) h

* N# `$ s' f/ w. M) K7 `9 n5 k( idb.close();
7 _  l# s+ [* L
& V0 w4 n- J: _6 E, \. r}+ N7 x; O( j  J3 p, X3 K

: b% t5 s( Z. ]' J+ o2.2 : Rust 查询数据( {' B2 S0 l4 ~

$ {# \) W0 L! s7 vextern crate postgres;
& Y( O6 m, S+ \( w: P) Y
6 x7 d6 S  p, R# q9 y9 R( Zuse postgres::{Connection, SslMode};, W7 \6 V0 G' G) M9 X3 H6 T9 q. G. B

1 i/ N% f7 v; {/ g: q3 P* |% _2 R% Ifn main() {! j: r4 U2 T0 x& U% ^" M1 y6 F
, N* }. w  _1 N" M
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();9 D, d; [) v% {, X
: V. H) m8 s/ K5 k0 W4 I
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
# ?. J  Z' C5 T8 t; I- H
& b7 R+ |) K* X: V9 C4 r6 zprintln!("Found person {}", row.get(0));# h( O; j1 j' w
$ \; \! {0 E7 d' l8 K9 V
}
3 K3 z: a( b) i2 I( f1 v" z4 p5 I$ U% w5 c/ e" v. ?
}: c9 A: A0 \5 a: E+ y: `4 }, R$ j

, f& w) H, {# w! M" P  W7 u2.3 : Golang 查询数据1 h! I% N5 u5 c6 O0 _0 a* y, a

2 {; W4 b+ `& P& W3 Qimport (: h8 [8 [/ _1 N- s8 z  p/ N

- i1 i: {" _) N9 X7 M"database/sql"
" C8 }- b" C* K4 o7 c& {: u' G1 a. O: A: ~$ ]3 i
"fmt"; J! P( ^! s1 c/ ~' _! Z
  o2 d6 b) n8 l# o6 x8 H
_ "github.com/lib/pq"0 [" _9 f1 P- p; m  c

2 T7 z9 P$ ]4 ?  }" G3 t3 [" g"time"
, d" q( [3 n( D" P4 b3 Y! {4 B" l" {% X
"log"
% `# v/ J  n, ], X* s" F# `+ ]+ ?, g1 o& H; Q; |# n# t5 x
)
: I+ [* _  V  o: z7 E! x/ w, ]* r' t% g- j
type User struct {+ M0 U7 E1 B  H9 h, j# _: ^

  U, p) R1 W3 D0 z8 @- G; @UserName string% |- l4 ]4 n' u+ N) B
1 l' F) B, |. _
}
  W1 C" m) t* E: x9 A5 ?
" k! z6 c$ z, Y) i, ofunc main() {
0 B: w6 x8 a$ c% E- K; A* M5 z
$ W' x2 c  g" l7 [; X  g" ]+ rdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
2 ?& t, e7 Y3 _  P, N  r/ w2 N; y3 R2 T2 e! n" x
if err != nil {1 I3 _$ D( m6 b/ Y/ v7 q

& ~7 e# h& O) R" [7 Jlog.Fatal(err)
7 n/ h( k( X. C$ j1 W
7 |+ |" q: ]2 C0 D9 Kreturn nil0 Y' }1 A1 Q; F) [8 V+ [6 r
# R* g/ ]) F$ G+ _( K  r
}
& e) w" u1 k. }7 U& n: m9 E) Y7 D- l. W8 J
user := User{}
' M, h* C# q4 _: W/ R- q6 e9 K7 ^
stmt := db.Query("SELECT * FROM user")
3 ~: h0 U  H% y) I: P
. @2 D2 T$ p. J9 F0 T: ^for rows.Next() {# B! K' P" X3 {* h

6 K6 c4 L, P# D, ?$ m) d5 W; A# erows.Scan(&user.UserName); ]# O) G% n6 \  g/ H

/ i4 c4 g) D# {9 |5 Z/ e9 n8 h4 B: ffmt.Println(user.UserName)/ L6 p* B8 ~, j. d' C/ q3 m
1 Z$ i4 C0 D0 `+ M
}
) `% E5 J1 i( Y2 h1 ~4 l- Z6 x. `9 [) U$ o0 n+ @: S) U
stmt.Close()( A7 ?  O1 E# I8 i
% G) [( g" c- _: G
}
/ _8 Z- X6 n' }0 |9 ^  m8 [
& H+ l/ g$ A* H* |三、总结
7 z1 P1 G9 j, X, z2 B. k& }
% q, ~8 ]) o0 d' e3 H对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。% s+ T/ x) `9 W
$ Z7 k( D+ }/ V0 e0 V
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
, }( d  P! x" Y8 ^1 q
1 ]' w- v: j9 p7 o在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。3 q$ n, V  [. M. z# p" D

8 i& q5 b7 m3 f4 T总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
- E) W$ D8 K/ C, H————————————————
9 G3 D( s" }1 g5 E) o! t% q! Y8 w版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  w2 ]# A5 b! n4 P, N+ I原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
. `& \9 j4 j" q$ ~; K
2 C  d8 i# n  I/ P4 g! X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 11:36 , Processed in 0.047927 second(s), 19 queries .

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