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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

: S3 X" R3 B3 E9 W0 i一、数据插入 - INSERT; a1 ]1 B" ^" v& B& C6 Y4 y" v

! w7 i; }/ \, N5 X+ i$ U1.1 : DLang 插入数据
/ \4 M9 [  I0 S( q" \- k8 M7 E) a! }( w2 e6 H- q
import std.stdio;
' U( Q6 N, O  i' z
5 [" w* g/ ]* m. @import hunt.database;
/ J# M/ Y3 G7 n( M- W
3 C0 n& `8 R- dvoid main()
& m# F0 G; h  K! {2 V( Z
5 F, ^+ P4 j$ v* }9 b1 _# F{7 C, R- D3 ]  Z

, W; _4 ]/ u" R, v, R0 z+ \auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");4 k/ |% F/ g3 a5 B+ A
. j3 V8 y( B  U: o0 [. W
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
" w& n/ k3 G4 p- p4 S/ t6 W. a' a; y% n: k# {# i
// 打印插入数量% A0 j: x4 L  h# s

& v. _1 Q$ H# N4 x5 Qwriteln(result);
+ v8 @- K+ w% a" E% f0 e7 K, E7 G* C* z/ K4 N6 y" _2 C
db.close();
8 J; Q# p. r! o2 s8 E$ H" X% r! n- ~
}
0 L8 P' Y! n* j0 u- s6 U% t# W2 g, \" }% N6 @1 Z
1.2 : Rust 插入数据
3 _  K5 m3 y; }" h! F, |( E; k) `5 }
extern crate postgres;
* i6 s2 g3 s& B! J, T
; L' R' r5 |& huse postgres::{Connection, SslMode};
9 Q! F; ~  u7 r0 D. H9 b  h5 Z1 ^) {6 C
fn main() {) l; p! V, G2 a0 M4 v' C+ |

* ?4 Z, R, N+ j% c9 Qlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();& e* z1 N! a  j; G0 @8 c5 O  U: Z( [
" h7 h" A- c1 r
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();" c% D; O2 j* A/ q& {/ P3 \

+ g- E% @- {6 B. e- w}
: e" {* J7 K+ I* U- i1 t& f/ Z+ [1 U' a" R( z1 B" H
1.3 : Golang 插入数据1 _! r" b2 a/ I

4 p- @$ Y3 V( ~2 \2 g% gimport (9 A' |/ B6 D- f2 ~8 W
2 T9 q5 d- O1 i$ \8 ], o
"database/sql"; w# Y; J# C' R2 F5 A) l  ^+ ]8 W
4 l2 Y8 s6 N% t5 a- x/ C4 i* ^
"fmt"8 n" c% d# \* s9 {% e6 F
: q7 g, C3 k% W8 ?4 t
_ "github.com/lib/pq"4 j( Q: @* y$ p. m! p6 r
5 [% x# x3 d7 ^% L* I
"time"5 ]  q7 c1 N3 o1 ~

+ l  M6 [) w1 S8 i+ ]  M"log"
: ?# ?  V  V0 W& h0 s1 |, \; I1 O2 h) {: {; Z
)
* t" N3 [, v) i3 J
" }- W8 j  ^1 S# qfunc main() {! t; X; ~$ D& H2 K
6 M" n9 _  n7 O3 Q' }0 f
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
0 k5 _8 _' s' J! k. E/ y/ Z
9 Q" K3 W" e6 {1 w1 v5 Tif err != nil {5 f( r6 A: |: T8 d

1 A1 ?$ K+ b* K4 ylog.Fatal(err)
8 w1 q, f  u. T' Z9 M% g  r; I  I% Y) `3 R
return nil
5 d0 {* S5 B5 o, O
) J, u( ?. w6 _3 y6 W% |}
( _  f' ]! m& h5 ?0 O! w0 ~* r. E5 v+ I
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
; e, O/ _8 i, {' d/ r3 f& _1 M5 P" K8 N
stmt.Exec()
% x5 V4 `: G- P: Y. g1 W/ a
1 P7 u. E. S+ i$ m% gstmt.Close()9 `; s  [/ G1 @* H- O. t' q3 C
4 m1 y0 Y( |9 b$ \
}9 c" w( k. W+ V

- l0 i5 K" ~. h二、数据查询 - SELECT
4 R7 y: F2 u8 h6 U7 J' ]- h7 [9 ?* q) A1 o
2.1 : DLang 查询数据  I6 O  r* y6 F0 p7 L0 X, m  E
  Q. p2 R" b3 u
import std.stdio;
$ n9 s7 h" _, J! L: |5 ]
3 u5 H3 F7 N4 C/ D  n" yimport hunt.database;0 |6 h* R# Z9 B& z5 R, R& d, C8 D$ [

' `# z- x6 i! W, P* ~$ ~2 avoid main()
2 m( d4 s+ q1 N9 Q8 w
8 o) W& W/ F, U{
7 o' X; J9 H, U6 Y- i& d  z$ l& ?: E' R" d- P' R# d
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
2 P1 W$ K& i5 P- }4 g+ A+ `) c8 B2 w  f  n' h2 @. S; r
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
" L. E, L7 J# M! M
( v: a+ u! b7 z( K0 N4 H9 c{
9 s1 @9 G8 z4 D  `+ Z; a/ ?$ I  l
writeln(row["username"]);
, g0 e$ w" F7 h9 p; x
( H, B! b, r- y9 v}
' Y6 `1 v$ I; ?: [; y$ a% P: x& c5 C# m  @# F' s3 I/ ?
db.close();3 C- M( k  F. r6 d/ `  e+ i
' M1 n4 C2 \$ I* M6 k; W
}3 E  y% X7 z1 m
' O' e! P- _! b* j
2.2 : Rust 查询数据
3 q% T: R% E, S$ U
/ n* P3 ]7 z7 U2 a* }$ q$ M1 r% l" Oextern crate postgres;
) k* H9 p2 R0 K8 e+ p  {. h6 ~8 Q+ P% E( P; H
use postgres::{Connection, SslMode};
2 b9 Z4 f% Q- j+ f8 ?+ s" N: N2 {+ y0 W( z
fn main() {, G$ K% @4 Z+ _" {3 m% M
' r" F4 l+ i5 j" e) v  L
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();! _0 C0 P) K; \9 W
6 _  ^2 _( A8 I4 E' D9 p
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
1 i# }+ O+ l& P1 {+ l) G: u$ h: A3 H/ k
println!("Found person {}", row.get(0));4 l8 C( k4 L% K# C! [
% U+ j- R8 g4 ]+ j
}
; P4 j# w# ^* U* u, Z" u9 V
+ k5 J5 |1 r. J9 ]}8 H( f: _% Z) w& X% v" ]# B

5 i' b4 L/ h3 w7 \, H7 _1 s$ A2.3 : Golang 查询数据; d9 e& {2 U  q0 S8 D4 Q

4 F  [2 K+ L  }* Zimport (# J2 J; G- F6 V% B

  O& f3 U5 h( s7 a, J4 }"database/sql"
1 e) |% r" d- U$ K  p2 ]$ _+ U: Q- H, D; @" l/ f
"fmt"
3 t/ ^( P* {. f1 i; A: p+ s" z6 g7 a# I
_ "github.com/lib/pq"/ n; T: W1 }+ m# i0 ^

! _5 T6 R7 u4 R4 R, P! c$ U+ V8 k"time"
/ X: R2 Q' x( N" I+ {" w+ m; r. i
6 G1 C- `3 H! V8 A"log"
- Z8 L) f& _. k7 s" n& S/ W  S3 O6 s+ f2 I1 T8 V. K
)
- e& ?2 o. U8 ^/ N: S. M5 E. |0 J4 k+ z+ L
type User struct {7 F& m, A2 m6 q

& \# m" u2 o+ h( b4 T9 |: EUserName string1 w9 n. Z5 ~, C# O6 s" W
* G6 ]8 X( e& u$ g
}
) ~, i$ ]% @/ U# F) `% V+ X: U* ~1 C1 I' b" F
func main() {
( I* c( Z5 J  s0 J
7 [, w8 y* o* r8 Z3 g; ?/ `db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
  S8 D' s1 _6 J0 O( A+ K* j5 W% B! @+ T  a
if err != nil {/ F7 Z2 L. _8 {
) d- f: z4 |9 E$ K7 ?% L" x: C
log.Fatal(err)
2 E7 D" K3 ?! h
% y  K; K' v; o$ Yreturn nil
: u9 S* f+ |7 M5 D& N' b- r, d; P! A9 ^6 Q
}
* q+ i7 T- n* @! Z4 I* T' I" m" c2 S, M) N4 C3 g4 l
user := User{}
2 E; v& X% k) A  C% J% W  l0 O0 {  j; O
stmt := db.Query("SELECT * FROM user")9 r4 Q: O& N# _  R4 t
* x2 l" M* I$ ~! `- h
for rows.Next() {3 N/ G, I- S0 g8 {& V9 R

7 ?! D" C9 i) v; Rrows.Scan(&user.UserName)& z! E# z) R3 z/ ]' f, ^- ~

3 e& @+ l6 \: P0 Vfmt.Println(user.UserName), |; O" R$ w: N5 Q2 i- g
. [, J3 p& m0 @; ^$ E* R
}# c$ L' y- P/ p& S8 a
( i$ d& X( i0 H
stmt.Close()$ V0 E5 c( a: O5 M! f
! ^9 U' t. y9 a8 U" B
}6 t+ w) i" z) T$ {& |! x

9 s# T" [, w* p2 D& i三、总结
: M! Y* u- V7 M1 K0 n2 {3 B
6 z/ N( z" y# D% W" z% D! r对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。5 b. m3 a6 M( `: u
; h4 d8 \% q5 u/ T) U
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
3 d" D5 p0 A! r. R% d
) U+ ?+ l5 Y' K' F3 J* Y在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。: N5 o: ]; {! d) @( x0 K! t0 O
& g( u- i5 N: M& N; s+ v
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
  i& i, `7 }0 r1 K- \————————————————7 j2 {- N: z# n" H
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( e4 `6 B5 a6 L( E" `7 w
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
3 H% q; P  Z2 S- D7 \* n
% s) y8 s! R% V8 v" z0 ^+ B- `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 00:43 , Processed in 0.127372 second(s), 19 queries .

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