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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
; H" o, s) x+ S( G& d0 E: z! i! S1 p+ K7 k! o/ [: @5 p  V4 j
一、数据插入 - INSERT
' J* Z! y) b  S9 \8 j* e; h/ q& v; M" X  ]! Z7 F
1.1 : DLang 插入数据& W/ k$ \+ O3 o, F0 V  d

) _, ?& {4 J, pimport std.stdio;
1 Q* ~, @# W  q) |
2 R8 m- a  L) [! W9 Himport hunt.database;$ q, ?( j" a- b5 e1 W

1 S" D" Q) Y+ B; A1 h. \void main()  r  X5 ]# x6 P. t) m' ]
- Q/ z' h# [' b% r
{
0 G# W' U4 \1 |8 L4 O/ z4 |& M" o- c1 d% B
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");- A) c- E9 V  g
' Y* I8 C( f& O, l$ f! I+ s
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);+ r& S$ A7 j1 j
- T4 R* k. M" H6 x( z7 b
// 打印插入数量! e8 ]$ }7 r; ^8 g! E* _3 n

, B1 U! B0 P9 M' Uwriteln(result);5 R; x. }1 P3 [( _. k+ x. D

1 A6 g) v8 U  G+ G- J7 w9 O7 c; Vdb.close();0 F6 f# S: ]; f: u- V
& |2 F$ |& l2 M
}3 C$ p9 J  y3 h  v9 S
6 E, l' Z9 a+ x5 ^1 D& Y
1.2 : Rust 插入数据; q% U1 ?8 k9 {" c; |

+ }2 Q, \5 u7 [" |& Hextern crate postgres;/ Q1 }) S& h2 X  c- {2 ?
6 Q7 H* l' A% q' V5 _  r0 t& d
use postgres::{Connection, SslMode};1 |- q7 G5 s7 C. p" `; a) [0 Z
" i- j$ s4 }& \2 ~0 w9 d
fn main() {
2 |! M' K! T6 _5 J$ S/ f" }/ i
9 A- O# e+ F" l3 g" _* g+ \4 |let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
+ k0 M$ `$ o3 Y) L
  w! W1 n5 m: D$ R; R. \) uconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();" q* D* Y5 [9 P4 j( Q

* G1 A! W( ~+ Y+ n$ U}1 k4 o$ K; w' f# {+ }' V
* }* K. y& T, ]5 J4 c& z
1.3 : Golang 插入数据5 b, B$ T% L3 m% O% ~# _
! @) h) H& B/ x6 U3 f
import (& v" `, R: U/ M; q" V( C& g+ h
4 E" _; e& n3 @- T! n# T& ?+ \
"database/sql"
# s3 Q, T& W( i$ U6 H/ d
( E9 L( e* l% O7 h: `% I"fmt"
+ V2 C0 v& L: R) W; I. k2 S3 @2 e0 C4 D8 G
_ "github.com/lib/pq"
: _7 [% v. ]- x! @' T2 ]8 [' J0 \" ?
"time"
% A6 {2 u9 L5 p* W3 ]5 a. d9 V/ u8 x2 Y1 w& X" I9 A' r5 x
"log"
2 d/ }, l' f6 O0 l, O3 P
+ t3 d$ q7 p- B( I/ n6 _; s' T1 ~)* ^2 C$ O: k+ U4 S- U8 I) x; Z

/ _( w9 p9 X/ L! n3 y) zfunc main() {! `! r# N8 ]: ~

3 A9 e' f* O9 ?. f& v, B+ k- y! Ddb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")! M& ^: {7 U4 z, f( `

" Y  k. ~' B8 F7 u5 |0 @* S+ D: [if err != nil {1 M, S: z+ ?  u6 H5 S( p8 }0 Y9 y9 e1 R
8 k2 X; s; Q) h5 y  f8 g6 J# E
log.Fatal(err)/ b* o" B" Z/ V* \( r. @  g

) d/ u" U5 n9 J9 qreturn nil, @2 i! Z1 K6 b/ F

& Y* I* ~' h6 o* _}: _% ]  L1 H9 m7 o6 V$ y
: {8 d- d5 X; Q( M/ s  D4 J
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
, U$ L1 B$ {0 Z' ]1 |
2 Y4 _7 {5 G* s. |" Pstmt.Exec()3 Z* y+ M' t9 P# |. ^+ I* K1 a9 _

+ V  I; j$ W' s" _) istmt.Close()" f/ \" c! j$ ?) s  R

1 L7 ^! p" A' B0 x. S& D}0 R3 F: D) R8 g, B1 ~

6 {% s" {4 h! m' Z/ }) o二、数据查询 - SELECT
% G' f, ]( `7 W7 @8 b
/ `6 ]; o6 |! {2.1 : DLang 查询数据
* N- w& t* R8 `3 B* V  [4 Q0 y* f; ^0 V$ i, y. q
import std.stdio;& c, p" _% W( T; Y0 s* ?) u8 f
/ j$ M2 b& o- z7 s; A0 b. p! e  }
import hunt.database;& M' C' Q1 N3 p9 q* S; @

1 [2 F0 }' j# M& Mvoid main()
9 o: H; h6 F; }  D8 n' _; a& k2 K5 N
{9 F& d; R0 n+ G0 n& Q2 R( j* P
6 G  g5 D( y0 {
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
) p) Q6 C# ~3 M0 [. _1 I) o% s: f
1 M- g# e$ Y) e4 X- B$ G8 V% [foreach(row; db.query("SELECT * FROM user LIMIT 10"))+ ^! I8 V" ]& Y( t9 I

/ j, [" U0 D& O{( ~  E6 X- X4 K) x! T* K% ]) g
/ s6 R6 o( S% Y# t$ L
writeln(row["username"]);7 ^: K, n0 z( q% k) f' j

0 K5 p4 H; j* q5 w}, b! @/ d" F# \5 `& u9 s. c; H) \
1 n5 X# y, w: g# p: S! X* I  D
db.close();# i: X3 X1 w, F& P) Q& x5 y
1 U+ k) x9 e5 r) g$ f% _' B
}
- E0 O% y, s4 Y8 c8 a6 E5 I$ }0 ^( V, y& M& i$ F6 }/ l
2.2 : Rust 查询数据4 t  u7 T. Z3 v; W/ n3 ]* X

" B+ j& c" m6 S' ^  Jextern crate postgres;
2 F8 M* a/ a% Q; q) L. Y/ G& b0 H% @$ N2 X. Y: t
use postgres::{Connection, SslMode};
( j( @- G+ k4 `: k& J$ f  v' n: Y8 S! y! m5 w
fn main() {
* q) d1 ^6 }& ~5 D
  u4 o4 V/ x- x) P# blet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();5 J0 M$ @" D* @; ~* X0 m

  N: M" M6 h0 C1 m0 l2 _1 c; tfor row in &conn.query("SELECT * FROM user", &[]).unwrap();" L/ l) O/ a% l( S7 m5 r

, Y: }) s' p0 e) s/ ?println!("Found person {}", row.get(0));8 L$ d% Y' [7 k2 F8 {. U0 K4 v
- z. u; I4 i4 |
}
! g6 D5 S' x0 p
/ |- p) n7 M4 e) E. t2 ]2 D3 n}
. O! t' H2 m- R
2 R1 P$ Y0 U) x0 C4 ]2.3 : Golang 查询数据
5 O* g/ K+ P/ i" u0 v- m7 k! V8 K8 J: R) o3 I5 B1 Z
import (3 B& u! Z5 t/ c( ^; l! q
1 M% J, l1 D0 N3 y. C7 I" t
"database/sql"
0 ]5 ], m. i" L) n$ e
, b( M, U; y/ V' w6 q"fmt"
- `( O, S) ?6 y' `8 U' P3 ^/ K9 h0 K
_ "github.com/lib/pq"6 `& R' J1 V! e8 ~8 p
3 b& W$ u! m* [# j" o
"time"" U( N( g& Z! C

- R" x% ^+ h0 n- h8 C( Q"log"; H8 l6 a* v: Z% m( ~0 J: x

# `; o# Q) ?. a( u, a4 })3 r- d3 o4 n; O2 x, Z

. r+ Q! I% j% R3 jtype User struct {
8 e" h1 Q4 B5 O, F4 h* p" C0 o: i+ V5 _! u; R
UserName string
! L8 l0 Y# f0 \% |1 g- ~* i) t# r1 F" u+ s& `
}
' n7 J5 p5 ]6 [) E, b8 M' |; a4 O4 c; m: e. v( f6 k
func main() {# `- ^$ u7 K0 e; K" P( p2 {! a

4 J! v! [# w  i/ p* Ndb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")1 a. J9 \' C0 [4 y- K3 N, N

5 B' k) \! x9 ^! t: V8 E, eif err != nil {
% T* r( q' b# k( h: a, \9 e/ i1 ~2 ]0 ?& X3 _; x* ^0 z
log.Fatal(err)
% z( _( @0 I% L  Z5 A' G1 q& V0 u1 _
return nil
* m6 S0 f* X0 h6 L# L
% X/ @8 m1 P+ Q  z4 k}
2 G7 B8 E' l3 v4 X# X
, z/ B% b) ]* {/ k0 k0 I  Nuser := User{}  g/ _0 s# b+ T: w' i0 [& Z+ b

& j3 q/ v. n% Lstmt := db.Query("SELECT * FROM user")- w4 K0 G1 m- m2 W; ^2 U
( n8 _% R7 x5 d/ ?
for rows.Next() {( d$ j5 k2 `& E' H3 V8 [, x- a3 d
$ k6 m& `7 j: ]8 H; U/ [
rows.Scan(&user.UserName)
2 l( T& V# _0 _
; v/ s5 R1 ]/ Yfmt.Println(user.UserName)
+ t4 J6 H# j+ H8 z7 `9 c
: n$ j2 C3 a/ v: N8 b# a2 w6 I; `7 J" V0 R}( A# V; e& g" `  z0 K

& j  h$ `& [8 R: t& u5 h; L% [stmt.Close()" V# W0 }: c8 w! G7 M# m9 ]4 Z
6 D' f. N/ w/ T8 d. j
}2 t1 k0 D! T& w+ M% H1 x. C

+ s/ F: ?( b2 ?0 R三、总结& {0 c6 D! |! i. A0 t

) G  [$ O+ d* K+ S对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
- M# i; ?- O. [# o3 H. N
  Q( f; k+ x  y" B9 ^这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)4 D. O" X; q. P9 `( ^

! j( }( h, R! c4 k在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
% Y) g! W. y7 m' l$ Z# ^7 X' k! N6 b& w' Z- i
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
) t9 }- k6 \" O2 c+ j8 d! i* L————————————————
8 Y7 D# ^/ k, ^- _5 i版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* {# K- ]( ]  _/ Z  g: ?
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961! _7 _+ b$ }4 ]6 Q
- `- }( L3 c* ]$ d+ h8 c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 08:18 , Processed in 0.064347 second(s), 19 queries .

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