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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
/ j6 L: m+ a7 [
6 W5 L9 f6 U! K) \8 y4 ^一、数据插入 - INSERT
2 ?0 H- W& x5 f  \$ T
" I; Y4 r! v8 `2 G& J% t0 l1.1 : DLang 插入数据$ H7 O' ?; U# @$ J

) i2 e! b7 |7 o* `import std.stdio;* V6 @* L3 u* ]: L
4 h8 k' f/ n# Z" t' H' k1 P
import hunt.database;5 e7 A( A; Q, k% N& m, v/ p1 C4 h

8 D/ R& `+ G# s* {void main()
) M  G& T/ e2 v6 ]
9 q% v8 n2 e2 G2 C% n% o{
/ c. A3 l8 P6 ~9 P3 A) F) B. U, @, N# P4 m* J
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
, W2 W7 @- z; `# e8 q* Z. e
4 e3 T! `- \2 g8 ^! i, @2 z. fint result = db.execute(`INSERT INTO user(username) VALUES("test")`);$ d, ~4 a! `4 M+ c1 X" T3 {

: ^3 I  V! ~" G* u& C// 打印插入数量
0 t8 w9 a  |! i0 t$ H3 f4 K9 f# L/ r. H/ B9 a
writeln(result);' A( Y' D% ]- p. U! i
! C" K. c$ \9 c) D
db.close();
+ G/ y4 x# N/ ?0 l/ x& S& U7 ]3 A2 m% V& b; v  m' F  x0 m
}
# s+ P6 u+ p4 h5 O! T9 J3 q# m! v, w: L$ ]3 y2 F
1.2 : Rust 插入数据" S: ?# L, u+ a8 U( T
. A9 T. r' x# T" T* j9 h
extern crate postgres;
5 Q& `/ ~/ ]5 Y$ S( A) C0 W$ q4 X0 [0 R* G. d
use postgres::{Connection, SslMode};; S1 ]2 C) s$ G5 `
1 c6 V% V+ |7 X* N/ t
fn main() {
2 w5 Z  x. v* c; {. q# @( f
% L: @2 T& z9 e8 Y5 s  P0 Q( h1 _/ K! Zlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
1 M. F/ _& K$ z# l  \% Q- C0 |0 v3 [
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();9 Z) s: E* t# y' `! d

/ {  y1 h) w1 }1 C' g; l, X" {: y}- {$ \$ c! @3 l! Z' p6 w( n
, `' N* Y8 |' n& Q/ w: a# u
1.3 : Golang 插入数据. C: @# o/ f  t9 U% T( I, k5 S# t2 y' X/ J

! M; ~& b5 l% N" {import (
9 e! Z* k) k/ `9 ~1 \; T$ n" H: J6 e. \, y, W
"database/sql"* w. w7 b5 b6 S* O& e$ W3 X

0 I  f* q; Q7 o6 K# c: E7 \"fmt"
0 A7 B" X8 }9 Z  z
; ~( H+ C0 D5 |3 L_ "github.com/lib/pq"
# n1 w$ ]8 E! q; E
4 @* @  ^  ]( o0 a! F$ ]"time"
' H4 _4 ]0 @4 Y' Z$ c3 L1 ?3 m8 M; `# u0 T6 P
"log"
8 X1 P2 G5 P$ ]$ c4 V. N- P/ v5 H& C6 z0 L$ P, w
)
- C& [6 i5 Y( Z& W# I% ~
9 T# m6 L# p8 g5 S% Qfunc main() {2 Z  _9 k7 k% {4 Y
/ N: P' z9 C6 _" O
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")' Z5 [: `7 k& y4 A1 b
" n( u* n* y& X
if err != nil {
* [' @, Q1 u( b4 t7 b3 N, }0 A. x0 {, h* K1 ^1 k
log.Fatal(err): }' }1 z( p7 ^3 ]6 V
9 v6 y0 n7 t. y. o) V% C
return nil, `9 J2 J5 U& z% _- I. O! ~( X% E- Z
1 ^3 T' K4 t6 S% L
}( Y) J  z7 [& |' M

8 y4 ~* @2 @3 xstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")"): Z! F* @' W7 B! M4 s  ?( {

  c  @' R+ t& L8 P* hstmt.Exec()- z: x3 l9 k% s7 B! ?
( F" L) X  |. v, @# P8 U
stmt.Close()
' M$ V* n# Y: [- F0 X0 H/ \. t, m' }# Q, f3 h/ Q7 x0 l7 T
}. E  O7 T, O1 J, P8 Q
4 }" X. Z$ X* X% c4 c7 }9 i
二、数据查询 - SELECT/ r9 \3 s% T. K, J1 w
! l7 x/ J! ~! B
2.1 : DLang 查询数据& ~. M7 y0 W7 H, A4 w& m' A, `, {
4 k, d0 |* H. A; ^5 n
import std.stdio;
! Y! l! z$ J  L: X1 _* ]
; Y  r$ C" m4 n+ w, U+ Oimport hunt.database;1 p9 b( d/ v% n. G3 @

1 a5 x% u. E; O  ?: ]" Fvoid main()
: X: G' {3 @) C! e+ M) V" M/ E$ B$ @6 g4 d5 B
{' r; B% I# d8 |5 ?

5 j/ C8 S( t8 i9 ?1 @# Zauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");/ @( K8 p. o% I: N8 L

; r2 S. E. }5 H- b+ c! h+ Cforeach(row; db.query("SELECT * FROM user LIMIT 10"))) N+ Q8 o/ x8 |2 v/ Q

4 Z/ W1 ?3 y3 q$ W{3 o& f! p6 }' l  ~7 B& A. y

- C$ W4 p+ \2 d8 W( ~$ |4 T1 ewriteln(row["username"]);, ]3 U* z, }' K) a6 c2 d
5 f1 E/ D( c* c
}1 p! _! z, o* U+ N8 x' m0 w2 O

# j6 e  w# `: P2 {! Sdb.close();4 l: R5 o' m" f) w0 W, q- ]) Q
/ J. Y$ _% g+ ~7 b- Y6 j. {6 V: l
}
# h3 p% L3 }& g. f2 U+ n- c7 A
! z' g5 p6 z2 {& w3 c% B' x/ \2.2 : Rust 查询数据+ u6 I& S" _* C5 J

5 o+ j9 d. Z) u7 Y4 n6 k1 }8 Yextern crate postgres;" r% u  w, r, A$ M: f

4 B. u% t$ N9 s; I# Wuse postgres::{Connection, SslMode};
. e$ `" P( @% t- ~7 N2 _6 }, s5 w" D, T4 U. O. a
fn main() {
& M" K8 Y5 S5 Y6 m9 y& E, t. f
+ s5 V$ h1 L, {. l5 w4 n( glet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
; r) _# L* m# n9 u( X0 e
6 ~( i9 M4 {9 a. ]for row in &conn.query("SELECT * FROM user", &[]).unwrap();: q+ L& t7 A- e+ B7 r' J7 t
0 b3 A* y( y$ M/ J0 S% r  M
println!("Found person {}", row.get(0));
* s5 ^" `2 I% y* e; Y/ o& M  ]  ^/ i' t2 E2 W. X7 c1 ]3 z
}5 Y/ B8 r; q! f: T$ D0 D
! a: Z, e: T  ]2 `7 \& c5 @2 J
}( j( _7 y% I( b1 q0 Y( {' I
7 r( R! H9 p+ m. u
2.3 : Golang 查询数据- `, D2 H3 `/ ]1 g8 j! E7 V$ K

0 ]! Z9 F) ~) W9 C0 S) jimport (9 ]9 S7 n- S. K/ ^/ @: S* R: `

+ H- ^) M5 k- A% |% a- k"database/sql"7 b4 Z+ c% O" _! c% ]) E; G

2 G' l; y# L" D# l9 C6 r"fmt"0 t: r$ {2 H3 \9 m# |1 o+ U" @- f
" O* v  ^, ~; E& u
_ "github.com/lib/pq"
) J4 m3 C& f3 F, l8 m
4 v# c8 S8 r& n"time", {0 j( @$ ~) d5 ^  @" s
8 Z; x( q$ `% M# E& Q& P- p/ H. w
"log"
7 o% N- t, v) a3 O2 s/ d5 C, p" N, A( ?& j; j
)* G/ _. L% D/ u+ ?2 e5 ?* x/ c
. g+ K6 |* q1 ]  B
type User struct {& e+ ~; ~, Y1 q0 ~# @2 b
9 S0 m) B3 l! G: w0 q8 P
UserName string
7 U# R* _$ h8 `& Y* V& x7 H' p& V
}
: ^; _# O$ L  T5 [6 }$ d% v! J: l7 ]
func main() {
) k% ]) A9 L. u/ j. i5 ~
" D. J9 y' q$ @3 x+ i& rdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")7 T+ r. q1 Y3 K6 T

, F8 Q5 e; e/ b) [; _& z! @2 T5 fif err != nil {
2 c. p! ~$ @8 V6 k6 `! u; ~# ^( b
log.Fatal(err)
5 @/ a  i3 r* j8 \
4 S* P) ^, @! M) O* dreturn nil! {# I( O/ s/ H2 }- P/ P! w

! v- k. _8 _0 f6 x1 G}
3 h! G  L- l! f4 n# h
' p4 [+ H9 W( guser := User{}& V$ Z- X: s7 f! C: `' b7 [; w

- T# \+ }7 M1 l1 wstmt := db.Query("SELECT * FROM user")0 O( ~, B* f5 E
+ T) j* z. D" {5 S
for rows.Next() {' S0 G* A  p( _! b: b0 Z1 k

- B; X, Q$ |! A/ j! p2 |5 l& Arows.Scan(&user.UserName)
% D- A- p5 c& `$ _
2 b6 Z* v$ E) e/ ]fmt.Println(user.UserName). A, u2 M/ k! X  R4 s& v

$ ?/ c* z* O: A6 f% e7 F}
# Z, n# L  H5 ~/ T2 o1 f  i3 s3 s4 G9 ^% X1 P; r4 M
stmt.Close()/ z2 Q; @: t$ u0 s* }# r" L
5 \. u2 W% r" e# ^: }
}
5 S! J$ N0 f1 ]* n8 y) j7 S  n
3 F: R. S1 U  u- Z) X三、总结
7 H4 P) K: q0 c  f: S. g! ?
  @8 r9 x3 }* Y7 V1 b$ P6 `' ^对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
9 c  k& v% r9 b2 K, X) L  {
; _: _) n% Y( }: }; b" \' z这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
) T( T+ M' g1 ^# c" ], G+ K+ U$ i( h, {$ j
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
/ [. ?) c4 y2 o6 h+ e8 z+ d5 L/ o& E- ?* ]7 G  C# I; R, `3 F
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。. o: t" d& I& H
————————————————! x) l0 @* Z& A8 u# w. q. i; ~
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
4 _  d& w- G' {* ?原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
, o. W$ v1 o7 X/ ]: Z6 m
! S6 `' L( V, H& d  {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 06:36 , Processed in 0.059328 second(s), 19 queries .

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