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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

6 v+ W6 N3 w/ P# V) k% K, N一、数据插入 - INSERT
; v. D( c8 Z# q( J& e5 h# n# E. T- c* _1 W8 M# r
1.1 : DLang 插入数据7 @5 k2 W9 D6 [
- J' N' r# s. n
import std.stdio;
' R" Z* c' B2 [5 k  ^5 ]8 u- h- x2 \
import hunt.database;) @" h% E2 U9 K' [1 z

' M' v. Y: M9 a: Ovoid main()
! ^! p2 F9 Q: d* F/ X8 `4 h2 M. j, w; ]: s( z( a
{
- n& S5 Q. W( K7 [# [( T( l% p' K& E! J
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");* H: f# A, L: ^# ~. K- t

- X1 y% x7 U4 Z7 u8 ^int result = db.execute(`INSERT INTO user(username) VALUES("test")`);: v; Z/ s& y: X7 c- d" k7 @
* r7 E+ K+ b$ K) U2 C
// 打印插入数量3 f' }) U+ q# n" j3 j% C. ?9 ~, m

* a3 Y  i; {, ^( ]writeln(result);
, m; S8 k/ D$ v8 j% s( [
. S3 o' A5 g5 R- O$ Jdb.close();( H# }: t8 P" M) h

- D. C! D5 Q1 y7 ]' z! s( l( ^6 a}4 w8 _2 e$ d8 k
4 H6 d- h" a8 @5 b# V$ g1 @
1.2 : Rust 插入数据
- s6 D' E; F  ~- P, h( n8 ~- d; v$ z; s" K8 x+ }. i
extern crate postgres;
4 }' w7 B; U- s: B. O/ v1 I- q. \- x) I  o) S1 T$ S) r) x9 Z
use postgres::{Connection, SslMode};* Z% J7 `# j+ H, k3 T

" T/ }7 L+ N" X  V! f% Rfn main() {, p. t5 T# l' C/ x7 D3 o) c$ I

0 S& Z* r. {3 k9 A$ K! Alet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
% _* ?% S& I/ [) ]& [6 |
" Z: s5 K: a4 _# L# Econn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();0 i( Z- n# r! Z
+ ~# h% G' J* V2 s- A2 `' t
}
- g) x& L6 i5 l+ z9 x% N8 v
# ~& _& A* D3 ?" B* u# l6 H1.3 : Golang 插入数据
& B8 c, p: \9 s6 c# [+ n4 m4 S9 V+ h- @- u3 {5 @1 o! F* B- r5 g: Y; t, r
import (. P) s: F, @! f- `) `) n& B

7 F( r- W: M' j2 X2 d"database/sql"1 G4 ?1 h: t8 E" U; b
% `/ O1 \% u' t7 h& O
"fmt"# r6 a! P% [0 L% o* R! Q. n
/ S+ D2 |' A7 m  b
_ "github.com/lib/pq"8 ]- K3 ]9 c. T, i8 v% u
% ^  {% m1 G6 E# L1 {0 Q
"time"- f4 O% l' F5 R3 x

' A8 V( }; Y( |! F; s( W8 t5 ~  a"log"
' U0 |7 c$ x2 s
+ L9 H4 a  L! A. E5 t)1 G6 Q- k3 V1 z* B- z
; g# [" d- i. I! V9 D8 V' ~
func main() {( D3 ^: i! ]4 R7 E7 Y

) I0 y1 ]  e% i1 E5 u& jdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
1 M4 u, `) v( m: {0 t% Z% s
3 R% t+ f/ F! W% I  s4 oif err != nil {
! `4 H) }+ c. S2 z9 n  S7 S  ~% Z2 _
log.Fatal(err)9 w( Y& l3 G7 E; s, o: {

( k' w0 V; @/ \( E1 V! S9 oreturn nil
1 ^9 Q  M# w4 W3 K  ]* a
! o9 s. D+ O, P' G4 n1 S0 e}
* E4 N1 ^& u* q8 N5 \/ R9 @6 Z6 N% L7 y7 R" g% `& \$ x$ y( ~' i
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
! m6 @  C! z: h+ Y
# @; z( x  _0 g% z( z: y) Gstmt.Exec(). l' |+ R, Q5 K* h8 l8 w

& B' A; n. e# X. A7 v2 sstmt.Close()
, a' O/ |% L6 x! b
& u6 y, v* @6 r  a+ e# U+ z7 G}
! {" a4 f" W. V. @" C1 c
& k6 g" o5 z& Y2 v2 w! U二、数据查询 - SELECT+ y$ {) O7 ]  R- {' Z

/ l: G0 W1 g& e2.1 : DLang 查询数据
& J! _9 k& D0 u4 \; _% v$ k1 v( t$ d' A% T. k
import std.stdio;7 ^" @! Y/ \2 V0 ]% E' b1 _3 [
5 M8 ^! H3 k  S: r
import hunt.database;! I8 |7 Q. u2 {; H: i
$ d/ C$ i: K2 I8 s$ L
void main(); @5 W  d' |2 o/ k/ c
5 n: ^; _7 M) I! N
{; w3 P( \$ W9 g. u! |

) }! Q% f/ d9 i# m) Mauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
2 m9 E' U: L4 Z! I9 G" f1 S
% j8 g# ^. w4 B. c- A: g: N" `foreach(row; db.query("SELECT * FROM user LIMIT 10"))
$ l' d1 C( X$ q1 W; U; @8 ?; k  g! y
{
) J- E  M- q2 {' l4 o
' `' j: ^3 e. l) z( @* j0 nwriteln(row["username"]);+ v' Q% M% W2 z+ q) g; n# F

5 O- W5 E/ t& Q- b; t, h}
* f- Z# x4 t+ K' C5 y9 j9 {1 l. C7 w' v
db.close();
9 R- G0 Y" ^' k
2 }6 S' |2 ?; h8 l; M}: K9 c( v& a7 b' w& j! k) q) u% U

" S# R9 u) W% s% w2.2 : Rust 查询数据7 d3 k- Y1 m& y4 C0 z- ]: e! F
7 y! ]& W7 K( F: D
extern crate postgres;! e2 \* Y6 w; H% T2 j  {( M* L" Y
# ?4 ^' E4 A$ J) O: N! p% ~
use postgres::{Connection, SslMode};6 u( b, D2 P5 E# a$ L
# X/ y. D9 g9 ?/ f8 [
fn main() {
' a" R+ w% O" c3 T1 C. |2 n7 c2 Q  F: }7 T+ ^. [
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
/ Z1 x) y0 I; `( @3 @" S! d% A) t3 V% I9 K4 y
for row in &conn.query("SELECT * FROM user", &[]).unwrap();$ l! G  N4 k$ R% `

- L* e, z1 q7 O- E; L5 ?; ?println!("Found person {}", row.get(0));6 Z0 j# I1 [, E' N

, n- Q; |3 X8 E5 H: G}
9 B/ c) w' [2 y( z$ |4 M1 E! l3 c( k. l$ `# g& j; z1 F. Y% ]! ]2 J
}
4 i9 u* S7 u' _! X
4 ?* ~  y% Y& c# H& C7 R2.3 : Golang 查询数据
/ p% I' m& O2 f
% j0 u9 J" I; J0 q, q" [7 d: Qimport (3 x& X$ m+ F0 U
! ^) F# f2 H, a7 N
"database/sql"6 X0 S8 r! r) b% k# J& g& T, k
/ c, \4 f2 R7 [& l' M
"fmt"  f' ]: H* u9 \0 d& Y# k" W
* ]; b* f% q2 k8 ^9 K8 Z
_ "github.com/lib/pq"" t1 N( y+ l% F, z- d
+ U- A' C* z) n$ f
"time"
2 b1 }# p, o" b6 R2 g
; A% I2 h' J* o6 W: |, C/ z"log"  a8 P& g8 X$ ~  A& U

7 q! X, `# B. l)
4 W+ m" H/ N7 \! b
+ U5 y# @0 H/ [# ?) Ktype User struct {( ?5 n$ Q; D% k6 D, r+ C
% U, v2 i- {- d% `1 l% k* ]/ F9 |
UserName string4 T! u- e: Z% u  J; D

# U" m5 A8 S: u* b0 c3 ]* _}
- {/ v2 O2 ~' @4 d) p0 `7 |3 n- Z; _$ t3 c* M% {; P
func main() {1 K: ]3 b+ x. F; B4 x* `
! q" d+ M, e) m) l) Y
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
/ _& E# C  n0 p4 I* K5 Y! x. b7 W: O/ [
if err != nil {
! j  n% I) Q$ z. @: ^7 w+ P: H- m6 v- e, U: }1 ^* b; r
log.Fatal(err)
5 H$ t  p- H( d! x  @9 `# B! R. y; l
return nil$ z5 L# B4 |5 x
! p9 ], o, I$ H- E) ~. E) G6 w: G
}
9 w2 Y1 F5 t" M  T$ p6 c5 L) U
3 R+ E  p9 s. J9 n# F0 A2 `user := User{}* `6 V6 u7 {" T% y
7 a' k( X* l4 h) a! ?! E. c% k
stmt := db.Query("SELECT * FROM user")
0 W4 o* k& d; M5 h4 D, B& |2 I% N6 `: U: S
for rows.Next() {
5 ~0 Z, x; I7 W. M: j; Q6 \6 s$ j9 D/ s
rows.Scan(&user.UserName)
* y. h2 r! ^) ~+ e4 o1 [
) E) `! z* w, `( C. T0 x( zfmt.Println(user.UserName)/ P8 U4 t8 `& [* G* a' g4 j/ ~

( b/ U8 r) D0 J  }: s}
0 V8 |' P+ Y2 o5 V( _! `  x9 g( R* ^9 h+ _
stmt.Close()
. w+ u7 A' U7 m+ H; D* L3 t
+ o, x- L2 |5 q+ y9 G, O* E}0 y) h0 u/ c% U/ T) D5 J  G
1 c! @2 I  q3 V* r0 l
三、总结2 n1 U' i) t1 C: m0 [
( O$ K% D0 `: X" M1 \/ @2 A+ w
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。& g) l% z6 {2 x. [& [
5 k" t  A; T2 D0 ^' t) S# i
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)2 a% P$ Q6 [9 k+ J8 F

# ]6 O9 F7 {& G: d& G在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
& B  x: |3 b/ m$ I
- k* ]# H0 W1 U6 H总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。/ b* U1 e4 c0 I& ?; g1 D
————————————————8 f' q! G$ |& O) o
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 L/ ^  \  s, [4 ]9 g$ i
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
; h7 O' f! p+ D2 N7 u: I4 j$ z, b) G! Q7 h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 16:06 , Processed in 0.079762 second(s), 21 queries .

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