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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

! N* @3 S. c! q8 \( X一、数据插入 - INSERT0 A9 j8 Z- `) k' A5 x5 v6 n

$ c. G- x! F6 o$ a) t1.1 : DLang 插入数据: F& {7 y" r2 y

2 B9 j' T9 l$ \import std.stdio;
9 S) n/ d. {6 _1 G  t$ F( F" a& K2 n% }) o- D; @& Q; A( }( W
import hunt.database;$ i6 w2 v- ^. M; p

" p+ a' ?, e( i( p0 c- qvoid main()
9 ?7 L& L* [3 [% C
, S6 R& o) M6 m$ D9 r{
+ t% ?( _/ ?0 j( d) Z. Y, X# W) I3 l6 U, r# c' a# ?# I
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
7 i5 a8 d. z4 R5 Z# d9 k: A! o# D1 S& {1 E. y: Y, [
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
7 S  P  T6 ]6 ]& v- g
( K; T+ d$ P2 h& G// 打印插入数量
7 _* x! ]" W. \- s: R& e% u4 I; N# B; O
writeln(result);
8 m% y+ ]  k% `4 k, B) i2 G% |, v  m) D
db.close();
( g, j( G3 U# \2 M* U* X, V
: m% x9 y9 ^3 s% ^3 n. x6 B}; D' r7 c7 A7 g( z" ~6 R: n

  b7 m8 S, [+ @) {/ k% ~7 u1.2 : Rust 插入数据
% \9 H. m; r% _4 r& k" H) X8 P; h
extern crate postgres;
7 R  q* ~9 h' H& t2 D# }1 ^1 U- L
use postgres::{Connection, SslMode};
+ C5 H' i( N7 N* r
& M% t# U  R6 [fn main() {
- r4 C, }& S0 l+ ?
3 x  a5 y6 C" o8 d$ v2 k% Slet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
* s% W$ ]4 ^' H2 @; \0 b
0 h6 c. {0 J4 Z3 G7 K8 Q& mconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
5 @/ W# R3 q0 t: Q1 x# \- x2 I( j& x0 Y. n( U5 ~+ v
}
  ]8 \% Y1 J- i! V1 o% f0 @& N& M6 d5 V: Q& N, e  u
1.3 : Golang 插入数据- c$ `( ]1 c: e
  G! j0 I+ K! S; u& |1 L5 O3 s
import (
$ U/ f4 X( W9 C
1 {$ S, ^0 g" R( o"database/sql"
) x% W% {7 w% Y6 [) u
' q% t7 k  L- S" t- c" ]/ C& G8 a"fmt"
) s* [# ]8 ]8 k4 _1 d4 y9 _9 Q$ c6 J3 I5 D1 W6 O
_ "github.com/lib/pq"" M) U) d% Z/ _0 G7 k* A
( w, N& u' J; y# t7 j% ]
"time". `) A" i; P- r+ E1 x* U& ~3 A1 `
: X3 i) p/ {4 g& |
"log"
( ?; o1 K  S3 @  c7 w* T, Y' G' \5 [  P. u+ Q. c! p0 i
)' m3 |* q( s( N
0 j: i8 R+ ^5 B% I+ U7 \1 A/ b
func main() {2 z  V! Q7 p. |8 o2 r9 b

2 O3 b  i; I$ b: @7 @! |db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")+ h$ [& S* v: e5 h6 @
  G- I+ H! _, q  N) [
if err != nil {
% p7 P( Q7 ?  w2 Y5 [5 X6 Z% m0 d5 u1 ]  Q
log.Fatal(err)3 h/ [% _6 [' v

0 a  O7 u9 B4 j* C, _" |$ L7 @- Ureturn nil6 z3 T: ?* n1 o8 U

6 f: d3 r  k+ j1 s7 J4 F/ D  H}
( G% i' P# _( Z) E+ t) T
! h) |2 t1 M5 p% tstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
8 j& k0 Y: J3 B/ m$ D# B% k$ R* c  N2 n0 |: b
stmt.Exec()
( M% V) R6 {, K( R1 S5 {: w. q! h: g4 c. i7 h$ S8 x
stmt.Close()
. ?( }2 g3 e. Q" o- p! o# D4 l1 V+ o$ U
}
9 ]- i5 _, y6 |8 Z, `* ?) |  N* M2 U3 g7 S/ f
二、数据查询 - SELECT
. l* M/ e6 J5 |& N! x  s
: n; ~1 p& V' C/ u. o2.1 : DLang 查询数据
/ ]2 `0 N- \; m' e. f& V! W& @1 [& ~+ N7 g
import std.stdio;  X9 M0 A4 @" _
) {& s, ^% G& ?- ^  J6 D  b. ~2 z
import hunt.database;
4 R9 g; u( \- o& y" B+ i  d- {% r- f, s3 E' P7 A
void main()
9 d6 {5 D5 s6 }" ^- H7 `- O
& K, a5 K1 K/ W2 e2 u: b, ]{
+ |% ]1 ~; ]- J# Q6 g  X. Y2 ~+ p" H. e+ S: Y
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");) r& s9 W4 x  _$ T& C
3 I; g* ^# U: v; x) z" r2 Y  i
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
3 u/ g2 H# D# S) y2 w; I6 Q
2 O2 g4 w& ]( u* e. X2 p0 w{
% p9 C3 I& p4 C# _
) ?8 i) a- T# U: M9 M8 Swriteln(row["username"]);2 y/ }/ v& {6 ]$ @( B! R( v% [

$ ?7 Q6 U( B  {% N}" O9 r/ z- o& s( G" h6 `
9 ^% M% b; v/ N3 Z+ `
db.close();$ ]" {/ q/ `  y& c0 `

/ @- ^1 r" x# C/ O}
$ s+ g/ S* V% }; e/ M, N2 b% \: N
9 u% e. T. w. R$ N2.2 : Rust 查询数据
1 k7 P. I4 S  h
9 Z, G* p8 r" `$ Wextern crate postgres;
$ Z/ _% s* C2 i6 G+ {" G+ T$ O+ ~
$ X9 j- [& t$ n5 Yuse postgres::{Connection, SslMode};
- ~4 d4 e1 q6 L  ]1 }8 z7 S# V( [
fn main() {* {, V5 b" z; j

7 h' F& t6 q3 z' nlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();6 p# p5 V7 S) d& p. Z

- ~+ _5 O! R  \for row in &conn.query("SELECT * FROM user", &[]).unwrap();# f+ Z% e! C2 k% |

. E* H1 v# b% w6 k) Q# xprintln!("Found person {}", row.get(0));
: [/ q' J% t6 ]. K; k; h4 q+ y4 C0 I3 A0 r, ]
}; B- y" [  V7 p

% Q& G  F& }, {* K: a# E1 z6 Z}/ h+ Q6 P( m6 y) ]
/ }* ~9 V3 Y7 q$ }- c+ F
2.3 : Golang 查询数据+ k6 w5 I% u; ^% y8 @

6 c4 T! _, W8 ~9 u% Rimport (
- U5 h* J1 O6 `  S: k+ r5 J9 c( \& L5 B4 W$ H2 B( [6 G' S- V& W
"database/sql"
( v- N# R5 ~7 p7 K+ u5 E6 L3 D
7 k, l* R7 ?; }% `0 W$ x* P" m"fmt"
0 ^0 `+ E9 b* J5 G' B; ~7 {0 G& j# Q
_ "github.com/lib/pq"2 p  ~! V; {2 ?' A

0 _* u/ ?( T/ H7 K5 G2 v: s* t"time"
1 w# D" Q9 W; m+ l8 u  f  M6 K$ z
  ]: J: T% |( y8 `5 }8 i; @, w, e"log"
# A" D; t! d! h9 q# _: z. L" O
7 p; o7 r4 A2 ~% a3 t& q% N; k)
' r% Z7 K: O6 p4 N6 W/ o$ a/ k) a
" u; G: ?# D( X! B$ P. Wtype User struct {7 ]* {7 ?1 d7 r+ V7 z
* X6 Y" T4 u' N. S. [% f
UserName string
2 |( C9 M* R. A# X8 Q/ y& q4 M" r7 Y, i! y3 Y
}% Q+ j8 c% W. Q9 B* r

$ W* h3 w# t; f! vfunc main() {6 R( G0 S0 n  o% t; c* \* Y
" H, E9 t/ `, @9 |
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")9 y0 @# D% T+ H9 D2 z. ^3 |" Z$ ~

. {; Z6 {9 ~3 Z9 m/ Vif err != nil {
* \& b; u1 R3 d, y5 Y, H1 t  I
" U8 b4 o) [- m' }7 xlog.Fatal(err): x+ m5 I) g2 P( [

  o& l1 C3 w4 y( P7 Yreturn nil
' ~) W; s, J# v+ v
" a4 I8 M6 c) e) ~3 L8 X}
- t* _: V: }% T7 o6 w4 r
( b4 Q% A2 ~4 c2 Suser := User{}
4 Q: f. R/ B+ J2 n3 ]" t: e5 T, d" V1 s$ K1 y* u. z
stmt := db.Query("SELECT * FROM user")9 ]/ |9 I2 [- W) U7 L& M4 L

! k" o0 A  {1 _  L7 Cfor rows.Next() {. j) s5 V" W/ e6 E
) x  T" {; o/ C, ^) R( c, M
rows.Scan(&user.UserName)
6 Q& @5 Y! @7 m1 V0 v2 s" C7 }
9 R( x+ m$ W0 e( Z4 y) M; d5 q) Ifmt.Println(user.UserName)
/ q+ E1 k9 l' a9 }3 @, z
1 g) Z& J- T; Y$ c3 b0 V& R}
: E* G9 x- _1 H! e% ^) I' y- z. ]3 u$ e6 @4 J/ k
stmt.Close()( u. ~' T. L- K4 \6 r
- W5 B- s( S1 f
}
' ~0 g! y1 l- a. ]  k' R& z/ Q; K
  G/ b. R: C) J1 K2 h三、总结
2 g; A  i! c. X8 I/ Y9 U/ ?4 f8 d8 v' b; N' ?" q. @2 O/ r: @4 C
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
7 J- t# ?7 H6 V! R3 j5 J
, k/ `+ q& c# A& I' ^' z( R! u) Z8 {这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)* `# w, Y4 [8 G

2 z& ?3 E" {+ I; L在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。+ Q9 T) o' @& u! {+ K/ `. b

* T; K2 a/ e* B总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。- ~) }8 m& c. ^; V; M
————————————————
! ~& E( Y+ |. v. ]版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  b. i4 R6 _& o. A4 X$ e
原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339615 R. t, l) n1 n- o0 r* T
: G: [+ O  Q, m6 g. p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-22 04:10 , Processed in 0.058950 second(s), 19 queries .

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