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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
- ~4 `6 e& Q& l5 O; h% `" J, Z. i/ K$ T! K; i9 T7 n2 x
一、数据插入 - INSERT
2 l. ]. F( j' W7 _- G& y% Y) u. w! ~' A& v/ @& W
1.1 : DLang 插入数据) u( m& ^- }3 C0 v  [

; K) c- [2 H( O& gimport std.stdio;
1 |& u% _% e) h: I9 [- {4 f. i. U; W6 m+ |& |
import hunt.database;0 R9 @7 r$ A" E" g* y! S/ H- K" h& r

/ ?0 @  I# Z& p9 S! b. bvoid main()/ g6 E9 n1 T" {: D- m9 ^
* e2 p4 A" u) i$ Q" u8 F
{
* x' x5 C) W& H4 J6 i9 g
: \- m+ b) w* R' t" M& ^, xauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
! O; ~3 R4 t& t6 X, e) C7 t5 n; T1 N" _0 G: V7 H4 `% M
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);( m# ^1 o6 l. e; l$ G* x) Z" k
8 P. [+ T0 H" N6 n' ~4 ]7 r. U
// 打印插入数量( E. l/ S8 p) f) i
6 A. [4 V# s. c. f
writeln(result);
! U( L% U  \5 v* v2 r" Q1 r* ^6 F1 D" t7 ~" U
db.close();
- j$ {5 ~( G5 G2 J5 h' [5 }6 S! k. a* N9 Z& C* D9 m* p6 d) D5 y
}" V" e, `. ]! |  D

1 r& E; h1 ^1 G$ V7 g/ n8 c1.2 : Rust 插入数据
2 c) _, W6 |( {: ]7 P; `9 _5 }2 {
3 L- k! ]2 @" Y, ~8 A0 aextern crate postgres;
6 A& l7 w+ ~" @( B6 v$ H
0 H, k9 H# V" k+ [+ n. fuse postgres::{Connection, SslMode};
! G7 z! a4 `3 T
4 b) }  W, N$ e" R5 Bfn main() {
* }4 ~/ _1 h% H( B
/ f3 ^" g7 S) B9 W) `9 ^0 E' Hlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();" J( d- I5 ?5 y% d5 S4 }2 t

/ L9 W; I* j) T8 N' Iconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
6 K9 m1 L8 U% \- n1 {
) `# V. f  ]$ a, S" E0 j# M! `1 ~}8 ^5 h$ M! R' Q& o! X% ]
2 C3 L1 S7 u, p* |
1.3 : Golang 插入数据
1 x( Q+ I  |2 `$ Z/ b( p4 v* z# z0 s
9 j- P5 a2 S) X! F  ~5 Q$ f$ kimport (3 m1 T& w* J0 T; h/ j  k
$ i0 U. s# E2 b
"database/sql"/ G7 ?3 Y/ P8 X5 ^! G3 G, ^. J8 i

' ^* X1 Q/ B5 E! [8 o8 A"fmt"5 n6 Q% n) K4 o. ]5 Z
( y  t2 j& w% n
_ "github.com/lib/pq". d. I# p# J2 l" e; t7 `
; t9 ^. E" S0 K6 t- F
"time"
! k3 `5 R" F  @) G! ]3 }$ |3 E
" P4 B( Z+ Z0 a& X$ ~; g3 Y& o! E"log"! M* `- [' g1 y/ _  _

: [! Q- e, i4 L0 u4 d" K)
* Q1 }/ f; Z" h# B& g
# X+ f& y, @1 mfunc main() {' x+ K, b) n. l3 w
. S4 u6 \( w! i. f8 A( N9 G
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"). z3 Y( g+ G6 Z8 Z5 ~& ^2 M0 c
- S4 Y6 g- ~% a2 n* v
if err != nil {9 I& G: r2 \: v7 c/ i

6 I# i  H; h) n& ?& glog.Fatal(err)& [( I! A* j4 s! q" s1 t
0 g: F$ c* |1 Z  ^5 ^7 s; P4 ~
return nil4 [* b5 \, c3 i6 z& V% d

7 ~% l3 R# S) {. O" v8 F}
+ n) S% O" m3 W/ M/ ^- M2 x" Z6 n$ T
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")% ~7 w$ O( p& L0 X5 @# A0 x

' ~* u/ a2 h& _' W% @stmt.Exec()
$ `2 Z  P- j  o  K$ F# R( L. h# b* [0 u# `
stmt.Close()/ J6 P+ F+ q6 X+ t+ C- d3 B2 g4 e
( `- v8 a! Z! x! \, z0 ^
}* p$ t  j1 u/ l% `! G3 i* G4 K
/ m  _- U- Z7 d. S' c* m9 Y
二、数据查询 - SELECT
8 o; {7 v4 F9 E# S, }; G, g; ~- m# ]8 B7 L  ]
2.1 : DLang 查询数据+ `4 S, |+ Z2 p6 C( G  ^

5 c' g, Q# y% z5 vimport std.stdio;
$ J! B  L5 l1 m/ W& t
. T+ ]. l( M4 simport hunt.database;/ K/ ^9 @) y5 g3 U3 D& K! b
+ W' h) ~  R, r& K
void main()
3 R8 _$ t& y, V) W
; M6 K4 S5 m* D{" I2 u4 V3 m& y3 }( G$ z  `
" N6 ^& s* Y4 w
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");% i- |$ n* _" K5 q. n0 Q

  U' o2 A" x4 oforeach(row; db.query("SELECT * FROM user LIMIT 10"))* ]  x/ K5 q" j' E1 B0 v4 c
5 b/ G0 R4 T# ?$ z
{3 }+ v( P8 N3 D) G& o
+ B5 h0 H4 [* f% M+ m
writeln(row["username"]);
/ T7 J" s. E! l6 n8 r/ `3 O0 _, ]" i
}
* z4 V1 A) r) j7 ?- d, x3 Q' d! K8 f' P" [- F
db.close();
' P6 N* j* c# ]; B; k' i5 A, [9 D
}
0 F  Z! H$ s" i, r& k2 h
7 }" |0 o6 _/ E! o0 _- \$ ^2.2 : Rust 查询数据- R$ d" m! h- Y% u4 S4 l
5 w  v0 X* m* s7 i7 `
extern crate postgres;* u) `% n& n. V$ O0 C

& h$ m) N- ?2 |+ D9 l! |3 Huse postgres::{Connection, SslMode};
  ]6 u/ y2 R4 ^1 F3 m! e  i. {' m2 l
fn main() {
* a- B7 L3 ?: [' C5 G2 V$ q5 L' c# e: j8 |5 r; a) I! m% }& \
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 O  G3 c6 g8 Y( q+ b0 v& Z
/ E8 o3 s6 y7 m; Hfor row in &conn.query("SELECT * FROM user", &[]).unwrap();( m# Y+ ^1 T4 A

. z; Y& w3 [6 z: C7 M4 sprintln!("Found person {}", row.get(0));5 M4 J) C5 @! {4 q. o" Z
8 Y" U2 x' c/ M$ Y; P
}
& C* H  R5 x5 z% f0 \
- y. D6 m; v7 v) Y. @8 y' S- F}) d- S# h5 J' z& Q' {) N

$ o+ R( L7 E6 y* G$ @; ~2.3 : Golang 查询数据
' J' G; w5 O8 a8 o
5 A: q: }4 R- r3 \import (
4 }* R( z, u% a1 N: S8 R4 d
( d- G) F$ l8 V" j" O"database/sql"
' |$ U1 j1 ?' ?% d5 p
5 J; C/ o, d1 ?! y/ R  O"fmt"
: I; D9 ?! D& i/ l" s
9 x' K7 q& W8 }! C; v: M- b_ "github.com/lib/pq"; E% L0 a9 M$ b3 |' s! O# U
& p3 S6 ~0 x. x5 l- k9 M7 u9 r
"time". X( x8 a6 g$ s5 o3 k

* Z/ {7 d/ A# l" e1 d+ g$ T0 r"log"
; ?; [2 S! I/ \2 U0 q. M& U3 p* I
6 P7 i' u: w/ f* E; _)
- D7 I3 ~3 @- ^0 h' d( N" y2 |( g# B
type User struct {. s; c$ y/ G. f" Q: W& O
  L  `: P! b2 N/ B* c
UserName string
0 d9 S7 c, F! B+ ]4 i+ A- V7 {- K
}
( n9 c% [) \: D! a
7 h2 k% A* u' h  l# j, H( u. a  ufunc main() {, V4 R2 D& A# H% C. S; I
/ r3 K6 R# O  p" ]& Q* V
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
/ g* T% d$ z, j5 q' o. F7 x) v4 Y; j# I) C
if err != nil {
, k! i& t+ ?/ R& h# \1 X+ }$ ^, C* i, X6 f" k6 o
log.Fatal(err)
- d8 Z+ a6 D4 J8 C; x" ?6 `( u- h- {6 F" y$ s# `3 P  }' P
return nil
+ I# T, b( @6 ?# j7 W0 t! u
4 @; g$ D8 V* x}! X4 d- Y! D, s% J
/ X' H/ G* w8 m* s
user := User{}3 S2 v- x0 G( e$ n
% z! |& |7 s+ k# q
stmt := db.Query("SELECT * FROM user")2 X$ Q! Y$ J& ?" q9 U0 m0 x

% b7 b) U3 f( \. `for rows.Next() {
  L+ P8 h" F& u9 s! h# d
! a  ?9 j' n0 E; a; h5 Mrows.Scan(&user.UserName)
! c* H2 [! h8 a: {% I, s0 [7 A; \6 G, y3 h9 `5 k" M
fmt.Println(user.UserName)
0 E4 |' T8 U4 v+ y  g* p! ~$ m  r  z3 o3 |6 H* V4 U5 g( z
}
& ~# P  p& C. _2 j9 ?; _
" @# ]' ^- k2 d$ K" e5 fstmt.Close()! J9 z, @# a+ S+ L: j) k) ?
5 D5 {$ E1 V6 H. i& s! ?/ f( t% A3 O
}
1 N4 K- w1 B& W* H: t' [/ d* W6 H+ c% B, m
三、总结
+ ?. t3 @4 d. A
+ `4 r  C$ j. E对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。# |1 N* T6 `' ?+ Q* R, Y5 T

' ^: R8 K# d# J* y, Q" \这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
' O0 U: h* L+ G; ?3 Q9 N3 T8 M" x. e. w4 e1 i/ H
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
9 I8 a: g" ^: q: f4 ?5 g& @/ e& @* R$ G' I9 j  {
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。- X) x/ X: j5 i0 u
————————————————
  y8 W( s; m9 M/ ]' }版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( z- D/ s: B- ^; e; {原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
9 h' i# o7 [8 B9 W
* c7 L% S4 A' C) y4 t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:40 , Processed in 0.106544 second(s), 20 queries .

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