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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

8 c2 t; Q5 l' V6 M4 |. c一、数据插入 - INSERT3 `7 `& C! r2 s7 Y1 _1 j9 {; a2 C; p
' z% |, a" p$ V5 j. P
1.1 : DLang 插入数据
4 Q1 }/ K, l2 R: a
! H7 x- R- ~/ z7 m) |1 k) T9 t  gimport std.stdio;, o( n8 T/ [( y+ j! c, l1 T% Y8 h

! Y1 h3 f+ G" ?import hunt.database;
' s: s0 M. {* P2 }$ o, Q& `6 o+ a- ]5 Y/ `; H  f/ a5 C
void main()
( X6 f) P5 t0 @6 A" f  b/ S3 z# I  ]
/ t3 L" _9 `/ ]# w6 s{5 j# u6 i% T) Z" _9 h+ Z4 p
6 w0 z0 x7 M& _$ t/ U
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
2 s6 g  N9 }5 q' z3 U+ T4 N; J5 r" a& \8 |8 K7 u* g* N& N
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);" _& h! D5 h- c* X% E- w

! d: f5 {- `: }: Q, _// 打印插入数量' b, @) l' {; N+ p+ g
  _9 g6 l& P2 g: f
writeln(result);
7 J9 }% U- d. v5 g8 l$ B/ z: C1 N; W& h6 |. q# Q( n/ P
db.close();
+ C' \* ]. {6 C& O& Z2 T  G+ ]7 A- e! A6 b& A
}
1 e& m; p1 ?8 }2 k: Q0 u9 t# x8 c
# L! N. M& L% C1 m1.2 : Rust 插入数据
  W5 G1 ~# q5 ?1 F  ]9 g2 C+ w" N) F9 P5 {5 B" B  q
extern crate postgres;
2 I# n, \1 P8 s4 K) [5 p3 ^6 `1 {( w
+ ~0 j1 }4 K+ L8 h2 U9 [use postgres::{Connection, SslMode};' A5 _; d6 ]# g- O

" a; `( I" l7 _4 S- F# qfn main() {* z. g" J% ?1 t& S" |0 b0 e
9 ?' Z7 X5 `; ~
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
  `! |6 L, K2 R
6 ~6 ^: I; W+ T5 {. _9 l  ~conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();3 r6 n' y% P% l9 c& r2 y3 }4 k+ ^- e

* z0 U. ~7 O. h/ Y& r/ Y; Z" c9 q}( D; j* V# ?8 [6 W0 b9 w
3 p! q/ c' O/ `) Z. h
1.3 : Golang 插入数据
1 I* P  w( o% [) |% A) V# `: _8 G4 b
import (
1 G" Y, j9 `8 Q
4 r9 O& n3 F( q"database/sql"
0 d6 Q: F5 L# h# @( ?& p; B8 q3 P4 y1 M! ~
"fmt"
6 Q$ `! `9 D  m( x: e
7 u9 I0 h; s9 n7 i6 n8 x5 I_ "github.com/lib/pq"
* ^  Y8 p; I' Q
' S: u1 Y- J, y# U& W, Z"time"
: {5 T+ D  r! `$ f! x' w$ d% l" l8 A* X2 p3 a* X& z6 _9 ]+ |( p+ m
"log"" ?, }+ K0 D' x$ N0 c3 I: |3 k4 f6 h

4 ]1 J0 ?0 U, i& D. G)# P/ m5 U1 L- u, [$ Q; v2 x
8 n7 L" G! z0 y/ i7 R, ^
func main() {0 X- j6 S9 M- ?' k  i

5 ~1 T, z- A* U2 }9 Udb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")' X1 X2 x, j: G% }
. y1 ~3 V2 W! l8 I
if err != nil {
; @7 ~  V2 o, o% e
# A8 g5 P  z& r  `log.Fatal(err): V; H' p0 X; W& Y6 v! i0 K

+ F$ B8 ?' `+ ], creturn nil
9 p; I) A2 ^7 j  Y4 X/ g% F/ }5 v7 ?: h2 L3 J: U
}) \1 c1 t, j0 @

1 _# O% Z: K- O0 a/ B+ `) fstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")/ A) @! {. O! T( }

1 z  L$ f  o  i* lstmt.Exec()
6 i6 b3 N0 h7 }- @' [4 x' V0 ~$ u  p! h. t. E. R" m  j# [) _. p2 e4 m
stmt.Close()
0 N( S1 r  o6 {( n4 T* {7 u7 {' ^2 E  w
}7 \4 [) K8 K- M# {

4 b/ b9 @$ s  t4 `6 p7 v二、数据查询 - SELECT
: C% x$ @* k4 w" g: ?) E4 W
' y6 Y! }4 A4 U9 ~& `2.1 : DLang 查询数据; o" u. w/ X4 G' S, F
8 u8 V' z2 C1 v$ ~( E- F
import std.stdio;
2 Y$ b4 }2 K5 M9 _8 @' r% G$ z: D* W( g0 I5 J- V1 _& D% A' C3 b2 Z
import hunt.database;
( w# \+ Q/ o" f( S! E" z
3 q; s/ w9 Y  q# [, i5 f( Z: H' {void main()& R3 |, y3 `" H; O

, l! p1 l; Z( [( [% I5 V  w& f{
5 I6 x, o9 r" b( v3 |2 {# A/ |4 S# p! _  C# w
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
$ K( k8 i& r* A; d  X, X4 K! c9 C) g
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
/ D3 X4 U+ r& p0 l+ p6 l' \3 r, k* Z1 K% x
{$ U( j/ G- s5 j, L0 q

* V5 c# X! H5 Swriteln(row["username"]);$ @$ p* H. I' k7 I+ X- f. A

& ?7 ]6 W# d3 L$ Z% {( P}
- r0 C( j. M3 S+ l  U0 m1 w; _! i2 {# j  Y- @" l) q7 f1 e5 v
db.close();/ I: G" @+ }9 [2 t1 G& {. R
; P, O; r1 I3 Z' r4 j7 T
}
% e* T5 @( \; K$ n: V) @) O( ]! k
& }! I( t: R9 \" m$ h9 M" X0 U2.2 : Rust 查询数据
. E# ^5 C! j7 A/ ^( K4 Y# @* K; U. ^3 z" s0 k) o7 X* i' ?- i
extern crate postgres;# q5 {/ U8 I8 I. M. b( [( ^
% S; c: A- D+ x$ k- x
use postgres::{Connection, SslMode};
4 t$ f7 U- `3 H. ]% A) v* i% g8 Q$ c6 w1 V
fn main() {" l4 h" V$ |) [& E3 k# j& A
/ a) r8 Y0 l" X* k  U- M! W3 \- l
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
6 O# v& ?) s% M* ?) j: `, M4 e6 h( j: l+ X7 Q+ p6 z
for row in &conn.query("SELECT * FROM user", &[]).unwrap();/ X: g) h) h  b5 n* s4 ]  K
( A; _- S/ M4 n% U: k8 y) U
println!("Found person {}", row.get(0));
! a) q- F: U& W' I
4 x" L. V1 V. x7 D# F+ z8 m3 n6 o}
- [) j; J5 H9 Z" D9 h7 Z
; |9 J) Q6 T2 L3 b}0 t0 i% N! x$ |9 o( x" S& s

) q% s- S" j3 `% d7 @2.3 : Golang 查询数据! O# Z5 X1 u7 M+ o0 B- h
( g  ^5 {4 j+ @/ H" N4 s
import (: a1 G3 O: }+ |* ~7 t, [7 l& y! b8 b

8 ^. ]% ~, P7 s& i0 f. E"database/sql"
7 o, z* y5 t6 |' ?
5 x4 r3 q9 ?1 a) K& @  E"fmt"+ b1 u0 O+ T- D

) @1 r9 K( D! `( U0 m_ "github.com/lib/pq"% c% d, K' t5 V8 {& y, j
0 V0 ?2 X4 @/ }$ p) O8 J
"time": E$ I- `4 V4 [
4 F8 U3 z: c; W8 x
"log"
  s5 ^% C/ x9 J7 u  t8 g- L8 d& l( {( B0 d9 o1 c! {
)) V- I, X5 |$ M6 ]9 l! N- q

& T; ^6 G6 L# F1 g: b3 dtype User struct {
7 T. R8 }" x' g  `- Z( {
" S7 X. l* Q; \0 GUserName string
9 u. G$ Q  h" \; A' ?6 d' `" Z8 R, m3 `# F' X9 U. d8 S" U/ M% Z' x
}. Z0 [; N* I& q# K  |

$ U( d& j% I1 d" `: Vfunc main() {
' L, r5 G& g9 l% ]8 y& x% u
$ @7 A2 C$ v0 K- D' vdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
& Y& I, o( M9 p# j! ^: Q% b. i; u& c* v! @4 ]8 I3 E% _
if err != nil {' z: L, E, {+ q, |) {6 o
- a5 ^+ Q6 {% z% d5 u5 ]
log.Fatal(err)
2 ^2 ~8 U+ k* @: ~% K8 U# J+ c# g( o
return nil4 Q7 x$ I: _; B& T6 X9 l* q& \

* W2 H/ D1 d. a; j6 S  q}- v/ ]; ~. J+ o9 r* h0 ^

$ e) O& n9 a# r, Xuser := User{}! h3 X8 J, B. o1 L3 {

1 G1 w9 a# {5 C6 |3 a3 h6 m1 N1 {stmt := db.Query("SELECT * FROM user")
* v/ Z8 h7 Z- l1 z/ g1 P2 F& g  b: Y, m4 |
for rows.Next() {4 j4 B" O( ]8 ^+ ], I$ b

% d% ^% i7 r+ k% P  _  ~rows.Scan(&user.UserName)
* h' I) m- T  v0 u" }$ [* R' |; }$ l$ U8 v3 Y
fmt.Println(user.UserName)4 g( Y( h$ K1 ]0 O. j
( t; j) ~6 k" B* _
}  f- L! x9 T( z

5 E. p+ N( @: r4 m5 m6 e0 W) hstmt.Close()- _7 E% s" }! o: a. e" n
5 V8 Q- C# x5 r. F
}' K# U; [- R: O  N+ n' d1 l

0 u6 S; l1 \9 a三、总结
! `( O. I% m6 ?8 P
: `+ v* f# b" I- r" k对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
* x0 Z1 T* o# F5 q; A% K
1 H2 D: j7 b/ ?+ a4 N2 {# @这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
: u. r; ?3 t3 ~0 L
# Y# V% i& O/ n' k4 c1 x2 |在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
" f$ E1 t) U: P+ ?' q, {" _0 U/ l, N+ _0 ^8 v) w4 H
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。. N* W1 S3 T3 z/ X+ n3 ]3 T& X
————————————————
6 o3 J; g% P! @" j* E+ K( q/ m" _5 Y版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  R( _: r7 k- l
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961- a* }4 A0 D! ~4 ~
: P3 x/ T3 h1 O. L7 b. n4 v5 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 01:22 , Processed in 0.100654 second(s), 22 queries .

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