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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。% H7 V0 I. T9 `4 H3 W. J1 Y
! [. L6 \  z% K$ y& U, Y) M
一、数据插入 - INSERT$ u+ r& c0 G. F# ?4 S
) R1 P" y, S. p4 ~! d! Q
1.1 : DLang 插入数据
$ R% N2 K' M8 k+ Q; v8 }3 v0 r5 E8 y- t3 w7 r
import std.stdio;
$ b/ [7 N3 ]  I& j/ H
2 a0 @; ]8 H& K/ o4 B4 Dimport hunt.database;' \, z7 q5 m8 ~# U
: Y8 H- A2 b. m$ i$ z1 ~4 G2 L9 y2 M
void main(); [" u# a8 z: M0 g
/ g/ Q1 ^/ L3 G
{4 u$ r. ?7 {& }1 @; s9 j

1 G; X' o' N( @) k: T7 S  g% ]auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");! a- ]( x6 ^" ~) q0 k
7 q# H! g4 r. `$ s, C
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);+ n, n! P" d+ J( m( q
6 ]* q: z$ ?. k+ @: f; j5 n! p
// 打印插入数量2 I' H+ }, _% w% ]" S1 k

/ G0 F4 @. x2 w' ]writeln(result);/ Y+ g# r- k! V2 _5 y% w

& a) T5 {8 [/ Z- o" B, S" K: Idb.close();
( f' t5 [# k' B7 {4 Y
% K; i; |5 C3 ~+ {8 d}
8 J! n- ]2 f+ e/ J: X7 B' a" I% Q7 X) p  U
1.2 : Rust 插入数据
/ U3 F6 n' a: B! |. ~' D& h: D8 A8 S8 s2 v& K" \2 N+ w
extern crate postgres;0 g. v( D) T2 q& l/ z" v! x

6 V6 ]( ]" L7 v$ guse postgres::{Connection, SslMode};0 P- K  y, h# t4 f* x# N

, l& q4 B2 w, Y8 V* o/ ^9 _fn main() {  d* S3 d7 k/ X( e
( e: E& W0 x8 e0 X5 S* N, v
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
/ U  v0 N0 y( M1 p# s+ Y6 ?% T4 X0 w2 p1 H
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();2 r) j' i5 M) P$ C' V$ P

6 `! y* W' w, u  ^2 q# L* W' e0 U}* u1 a+ X" t' t9 F
3 ]: ~1 O2 ]: w
1.3 : Golang 插入数据
- j7 g. P2 h' I" T4 y# O7 D0 K, R8 @+ `/ g! m" k
import (0 k: D" f3 p  t- {

0 ~& }8 P7 ~) y6 t( e3 c3 u$ n6 ^"database/sql"/ _) s) V3 H( \6 S- E
8 [# L+ D/ I- q3 U9 q6 t
"fmt"
  t# y0 B. E, m3 o' K; k
( M) }, j$ a7 \9 k# ?_ "github.com/lib/pq"
5 N- d. ?1 E1 N, a- c$ ^5 x# A9 N1 ?" P+ }
"time"
, O5 K. g7 T! U# K0 E& @4 v4 Q: y2 x4 h  ~2 C
"log"
* c3 A! ?$ z, f6 w8 z9 E% q2 {" l5 l& r7 u% [  T8 A
)- V4 H( f1 d, \
$ J2 y$ |) F: G! j. B0 r9 Y
func main() {
4 U4 W, {& O* K/ x
3 ]3 d! h( B' G( Z4 N( Odb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
! p: m. Q, K4 u- ?1 Z4 m6 ]  K: R' I( \" {
if err != nil {& ?8 g9 K) {# ]6 S. B
3 ]$ j+ o6 b. A1 b% }' y( g
log.Fatal(err)
' I, g9 N' C7 Z+ {7 t, T: l5 u( I4 c" e$ P4 c3 `9 H1 z! Z
return nil
8 w0 j8 m2 f1 ^3 M0 {. V  t+ B! U: S& f3 z# v* H1 a+ H; G/ }
}
) I( }" e4 B* _. ?2 C& a
/ u/ ?% ]2 s/ f, z  C* n9 _0 astmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
( N% q2 H  v, F+ Q0 c- E) E  y& a% j0 Z; d+ a2 j$ E8 ~
stmt.Exec()
' y3 e# ?: T& h8 |( F0 k
7 I4 k: g1 f) I7 Kstmt.Close()
0 L0 N! k8 n# c. d/ }) z$ N, T8 d9 a* Z0 q% x9 R$ Q
}
' s2 Z+ ^7 ~  p3 }8 {2 d7 r# P! M0 V; d2 a% _
二、数据查询 - SELECT
  u: ?6 X  ~3 p- }# \3 R) c+ _4 k/ M
2.1 : DLang 查询数据3 r" K0 P6 l! D& C8 S2 z
; }( E0 E/ d6 z$ c9 m/ U  @" ~% T) ]
import std.stdio;
: m2 }- |; Y8 d6 A! o2 k8 n3 N' d! }: [1 s
import hunt.database;; k9 ~: |  k6 g, n. }

8 w9 A& |) E5 l& K0 G+ ivoid main()
" |' f# e2 C# k5 C; q$ d  M0 E0 Y4 L* v0 \& v+ L# Y
{, I9 q$ @( g. _5 {. A: M( t. \: a; x

8 ~' y. }5 C+ J5 Hauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
2 [- a7 Y( m- @( y
( s2 n2 z  N9 R# oforeach(row; db.query("SELECT * FROM user LIMIT 10"))/ H! A5 N7 r: h( I8 ^- T/ `/ V% I
6 d) P" B- X7 t. O5 \% ~% M; Y$ y
{+ D$ R* V4 m$ f2 r' J

) d. q9 j6 p7 `0 \writeln(row["username"]);7 {& R  h+ b- d) z2 H) F

/ F; R: e) O9 a% b. l( m3 i- g1 ]& x}& t- p' s, F; l) h
8 _9 j; X, ?+ o0 ]8 _) ?- w
db.close();) q3 U! n, P( L# m4 K

1 g8 t4 u6 I. m* S' U}
3 I0 ^9 I. Y7 I5 Z# D& A
$ g' }2 i9 m) k; i2.2 : Rust 查询数据$ d8 W* p0 E( ]4 p9 p( e

7 d) o0 {% [& s* W  w+ x7 Gextern crate postgres;# H# w3 d& {. d* C7 A
, z4 a: G" o- l: e8 K: B- ?7 B- ]2 n
use postgres::{Connection, SslMode};" y" X1 i! u% z" J; Z% S4 J
- W* Q8 g, c$ V6 R; g
fn main() {
. Q" V% D4 ?. |3 {- J7 H: F$ u: k! \6 K( A# X6 f
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();% F: Z% D0 }% n( t/ R

! s  n* {' m5 e! Tfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
6 |8 ~. f7 o& [* i, m1 c6 A5 k# b
3 F+ R4 h5 T3 oprintln!("Found person {}", row.get(0));
% q3 {/ ?. v- H+ j7 P( t+ u( @. i7 q9 B+ V  r$ A
}) o" y" o1 y9 e* Z3 Z, N( p
$ t  Y& j0 U9 S# k" P8 h
}8 D4 m- ^! b7 c& x) @

3 p3 c% }& ?2 i" b) l2.3 : Golang 查询数据
) X4 L0 S& C4 e! Y& u4 ~; E/ f( c7 V: p/ s% u
import (" M+ W/ |& e4 Q/ v6 W
" c4 \  o# N) o' r/ e4 d
"database/sql"
5 [$ ~1 J4 h8 i& s4 W) R, V) @! A  e7 M8 p; ^/ s, q1 R
"fmt"5 c* z8 y  w. C
- M2 ?) g( q+ D" [) K2 z
_ "github.com/lib/pq"
' |" J8 T% W" N$ g/ h) h
  z! N/ e* u7 k+ w' }"time"
) O/ a8 R9 h- F# X4 A7 m# {. M+ m/ u
"log"+ W$ H- Q8 y; U0 ]! h/ H

' ?* `  S5 o8 }! Q& G8 z4 H; R)0 f2 E. `2 Y1 @' {5 K

6 H8 P5 y/ T% s* Y. R6 y7 M! ^8 Ltype User struct {
6 Z0 N3 m  [. w2 Y
7 G' ~0 g2 P8 E% i. XUserName string
) O. b5 K$ ~- d% o# h7 ?5 q9 J6 C9 y+ g3 F. [2 C0 Q% q( o: l* c. i
}1 o$ }* W9 P( h' d. G% z) `) ^; [
7 d/ P% }% L; O+ D
func main() {
8 Z; ]8 [$ T. n8 Y! }: U9 p5 O* J! ^4 p, p# }9 D& f
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
: K6 c2 v5 {. ^1 U' j4 F- K( i' v( {( [* ?! W4 I' g0 `
if err != nil {
1 f. d, f' `; y6 N8 u6 i* Y6 i
: P' o" V7 x; C% p- O: K3 ^+ b+ flog.Fatal(err)" k: b; u8 O) Z( q& o4 o

3 {$ h0 |* M5 p4 E) f# Rreturn nil" ^0 h: t) c( j& o# {  x

0 u) L" M7 {$ Q. I2 N$ l8 K' s5 {+ ?/ E3 v}
3 t0 u2 R, b- S7 Z" a+ J' i& \* P
user := User{}
9 R2 |7 I) _, W1 c: Y' K# {. |5 U3 H: F  c( O
stmt := db.Query("SELECT * FROM user")
. C0 ^+ [& \* @' f& {) r0 i+ A$ U: p0 M4 c6 m: ]
for rows.Next() {
- s0 V0 j2 {2 t' F6 F. E* \, B  A( g& r' O- P9 b( [
rows.Scan(&user.UserName), T5 F; N' a7 C- t8 k
. r' z; T* H/ s+ G2 e
fmt.Println(user.UserName)
$ Y  b- j5 H) l9 y7 h" i5 E: B( ]7 K: ~; Z# |
}/ U9 N$ f3 Z% o; {9 I# Y" b5 o

7 V0 P5 v, h6 c0 p1 {+ jstmt.Close()  |5 W! K( f% H. b: ^- d
0 `$ O# k/ }* g, t
}' F. r, Q; K9 U1 U3 n

2 ^2 O) o. [7 o/ T# ^+ Q8 \. J三、总结% t) a1 a/ G' a( y9 l

- I5 X$ R6 d' i0 a6 c% u# `+ K对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。$ ~% @0 q( b3 c, U& q& X6 \1 j

5 \' N' h/ x/ [这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
! E6 d& d# [: _9 O( u
8 z3 m4 m6 f+ a9 H) w- D2 k0 U在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。2 p0 D* Y& R& G  p2 N, h% d

3 h" J1 W' G* Q9 d( M总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。4 O- u  `8 |2 t4 Z0 R3 t
————————————————6 C9 ?; z- B1 Z0 u- S6 G$ H
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。- Y6 E  \9 J1 e
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
. i0 a6 h$ I9 a% [) [7 x. J. `: }' W* k# Q; T: ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-3 12:14 , Processed in 0.139187 second(s), 19 queries .

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