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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
+ t9 {: `( a6 A  {8 y3 ~5 J" x& ^5 N( p% X5 Q* S
一、数据插入 - INSERT
7 t0 {. ?! b1 Q$ S& v
: v5 K6 \. ]; f4 {* G/ _4 L* V' e' K1.1 : DLang 插入数据
9 I2 B- |2 B& {8 M2 S9 F: H, K. Z- D/ l, k' t
import std.stdio;. y* t. g* E; V$ `  n3 x3 \
4 ~( w2 Y0 y6 n
import hunt.database;% _9 R( R" E, C$ R

  S% B2 M' N: l; P# Vvoid main()% R! S/ J- G+ o4 e2 ]
. H  {" f6 s* f( I
{$ T. C$ R& {5 M$ k2 V

4 l9 L: v$ L2 A3 r; x, O2 fauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
2 H  u' @! ?) `
" _2 r! N3 h6 l) |2 vint result = db.execute(`INSERT INTO user(username) VALUES("test")`);# l' b. H/ {6 ?! j9 C

7 e% c' q0 t6 N& ~8 F9 A. _8 ]+ g: v3 r// 打印插入数量
; b$ p  W- q8 \" Z) A
! W% C; U  K  b  J) R" twriteln(result);
  T) c, x# [4 m
4 ?7 W1 o% K; @. Zdb.close();
6 \: q& ?2 W& ?" {; V& O! {* j2 G5 y& D7 X
}; i4 b/ K$ g1 `! ]0 y" }% O4 D
* d! p6 M3 B  y1 m5 d$ C' o2 M0 {) I) I
1.2 : Rust 插入数据
3 M5 l& l, g: x* F3 V$ f
. Q& N) K. D$ |) wextern crate postgres;) ]% r0 J6 ?: V! E$ u
, g# h, {$ J1 `# @2 j# T% o9 t
use postgres::{Connection, SslMode};
1 |! |( Y: U0 r/ K) g, d" f
, p$ ]# S; q) e% A& Efn main() {
. d: J+ ^3 q) N( i! r9 \/ }1 a# a+ e! y% a: |# q( W
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
7 r% h$ r2 s) [* m- d9 j
% i2 R6 K( g8 g6 b) k2 W% j2 mconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();+ {+ t1 C, _7 y# r3 W( m; M; U
5 Y7 i( ]( X: _* y- Y. Y% g, {
}
5 B! v8 W* u" @+ C
* C& O. l8 ?' l' L0 w1.3 : Golang 插入数据
4 Q9 C; W% m6 H+ k! r+ e
* y5 n5 @* D7 C3 I* _6 Jimport (: y; v9 l& k6 m  s. l5 b

8 L# m8 a& m; H7 k9 L/ |/ L$ d"database/sql"# _; n2 ?3 K' G
1 `; _$ z( ~+ R  d4 o; \/ W
"fmt"
/ S1 @5 ~6 C. J0 g# @
, w1 X9 @: l' O' R2 J. F_ "github.com/lib/pq"; b6 [. u, p5 U# G; i
9 h6 ?' V+ ~3 Y9 S+ l
"time"
' g- `- H/ Y4 d9 |% ^4 i& b* l7 Z2 y: R) f9 E, r, q' k. P
"log". h2 k. D2 c" O7 z9 C2 H

( o) w7 \9 W9 }6 {: o; p)1 B' Q$ b& Q' X# ?# T1 @
  ~$ R9 z; l- M; s
func main() {0 ~7 z2 W- R* r. s& y

9 ^9 U; [) {" {" b7 ~db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
, n$ T) x" s% \7 e! ~4 N2 A
* t& V7 A% E2 Aif err != nil {
4 ]" n" G1 `0 r7 U
  ?* s! t% G+ w6 b4 s+ P+ ulog.Fatal(err)- X& d8 w$ b1 x2 W3 A4 T& {

# _+ g2 k! p1 q. \; D6 z$ ereturn nil
5 P3 s5 ^% `* o4 c2 K) U2 U: a2 c5 n  W5 O+ t: N
}+ l6 v) T% A& q. E+ z7 ~

. n6 o2 U. V$ Y% [stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
" j/ o, s. P0 n7 I7 K
4 j) G" @! O5 w& n# m, ?# _stmt.Exec()# n1 e1 h' r- ~& t! R9 C
2 M. r: i& a0 o! _' Z3 a
stmt.Close(), m) h7 b& @( l8 ^2 F
! f* Q; Z, u3 X" P5 ?. {0 N2 P5 w" F% E
}
# F( ~4 w4 U. V1 [7 K/ N: q# j" I" h5 v1 d4 U/ c
二、数据查询 - SELECT
2 K4 |/ w4 y; |0 M
- c( I4 N1 F, _4 K" Q# ~& c2.1 : DLang 查询数据
9 S. h; ~3 o$ a% y. c) H0 `4 Z: a# W5 @
import std.stdio;. Y- P1 J' a! K, ~% w# Z
9 D7 g+ R* M7 g0 a. I" ~
import hunt.database;
1 C7 O9 P/ S+ T  t! }& W3 F  A" K6 y( q9 V
void main()% W* P: ?3 D9 z
5 Z5 N0 b( Y8 `6 ^" Y5 R. x" h
{
! e9 W8 u+ M8 A$ U
8 ?; v6 @4 W' B$ V7 i* y0 Mauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
7 @2 D/ O  P4 Q0 {' ~# ~6 O1 A  S1 E& `6 m
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
4 ~: c! ?3 E5 J, C
, X2 }9 z. o; [1 y8 }9 ]$ r{
) `6 m8 L6 W5 `, m, ~; J. m) G
  ^4 h7 p6 ]) g8 r2 lwriteln(row["username"]);& o5 }0 u( S$ O% p5 M% @% J6 b
3 Q& X* v- D' |9 T- _5 f
}. _" p# T+ {7 k, V! }+ a: a' s2 r
% b, e2 V" ~; g) x  Z5 y! `
db.close();
2 q  `! ~, I  C' Y! _0 w8 e! |9 O# @
}5 U$ V3 v; J+ D+ X
* A# N  j3 k4 x2 g: u# f) {
2.2 : Rust 查询数据
* M6 Q( O6 Q4 r* _3 ~% s% w& p5 G3 e  T: s* k
extern crate postgres;7 i5 j$ b4 {* S, k
* u( ~3 f/ l' K3 ?3 g, v8 ^; v
use postgres::{Connection, SslMode};0 R' _2 L9 V  C3 L5 ]
: x2 d1 j( o$ L4 H# d/ N
fn main() {
6 o) c; P; K" {! |8 ^
5 y% D' h# [; M3 n& Glet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();3 z" N" ~/ y3 J" Z6 p
1 j0 M% J, M+ _8 x
for row in &conn.query("SELECT * FROM user", &[]).unwrap();( s) b; h4 n6 J& K+ f5 @: W: G

6 `* a- Q2 o6 p$ Eprintln!("Found person {}", row.get(0));
3 a/ @4 m; s# r2 g: r! F4 j5 H5 P9 e/ S
}* U  a2 i  [9 u

: r3 n% P8 w( O# U/ h1 w}
: d- O/ g8 y) w+ O- l! o/ F  V4 s4 U1 }
2.3 : Golang 查询数据
; @- |- Y. [+ b* |0 r5 c
2 B& {: o& [3 j4 Zimport (
) x, e# r: y; q6 ]) a, L! x4 `  b* F8 T0 ~0 J, q* O
"database/sql"" Z0 ?: D7 H; b0 {+ i

' j# A- x! D# H  v"fmt"- v' j/ t6 b% j* W  n% G! x

' b7 I+ {$ _$ D+ t% Z+ v- G_ "github.com/lib/pq"3 J3 w, V# L$ @" C1 [) i5 K
- s6 z1 g+ t5 a9 ?3 i
"time"! N9 a0 \% j$ @4 W
; B- k  t# L  q' j0 ]1 F1 u/ ?3 Z; s
"log"! I# L/ z& `( F1 i+ \2 G
* G. V0 U* \; D1 Z" w$ ]  h9 `
)
/ G, v2 B. }3 d% t) b/ B3 q4 i, W+ E1 o
type User struct {
6 ^  Y: `; M2 J& Z9 [, R- ]. x) I( v. i6 Q) ^; S
UserName string$ D/ `* D; L$ M. w( g

% g& A2 M: n8 j* V3 o}" U& @) t& U8 p3 A# b% a# w3 @$ D

# x0 C: U* {6 S  O4 S- B, j/ x7 }func main() {
6 w; P6 Z9 @( @7 E7 C4 C
' _& A: G7 B# m5 S& \: Fdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
1 @4 |8 u! c# ^4 o$ {+ |1 l! A8 g0 \; {
if err != nil {
8 }/ r( r; z: J# ?
# W- K0 ?8 R5 ~; L' Rlog.Fatal(err)
! N  ?( D" T' _/ [6 m4 k% D4 X5 z9 U  |& R7 j
return nil
: s! j) T6 \8 P8 ~+ ]# g$ H. r6 m6 T; c8 a) m  f+ \7 f
}
; J2 ?: C! Z1 n5 t! Y( i3 [
0 D+ ]8 d9 v/ z2 B- ~user := User{}
% W& Q) ], A: [# E" W: Q7 |$ `7 `3 u- o* O8 x2 e
stmt := db.Query("SELECT * FROM user")+ f2 N' |+ ^# \. e( r

9 o% o. C( P9 i. t0 _5 f/ W/ ~for rows.Next() {! T4 u$ L$ X  |2 f

8 |7 o( Z9 ~! Frows.Scan(&user.UserName)! I2 d/ ?9 [0 q* R

  d" q% l4 U9 P4 o. \! hfmt.Println(user.UserName)
% i" j; S. ]" z6 K, j0 K) w
; Y* \: S8 J7 M) x}
2 J) F* v; v$ D( Z9 s2 d+ v. S" k, Q
3 @* ^1 ?5 F* [1 l$ X7 \9 |6 t) ]stmt.Close()
! m* G( v1 H- Y  ^  \9 z. M* b/ y5 s* l* O1 k) h
}
; I. P  ~/ p7 n9 l' X" K: ~) k8 Q% m5 C4 q4 n
三、总结2 ?0 o# ~1 Q0 a9 m) J

2 y2 a' }0 ], a( q* |4 Q对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
& u6 O( O. V$ H" r# x' D1 B. v2 G- S) e' Q+ _; T! p2 J$ ~% [
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)# {" z: b/ Q- U; b

. B- {+ [3 R. w8 l$ H0 N3 Z3 J& P在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
4 L+ H3 u4 @+ t/ s- l; _4 B& U# \0 Y9 w7 A! z8 ~4 }  _, k7 m
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
5 ^% |3 Z: ^% V* ?" r4 i9 x————————————————( H' m) _' R. J! _. |/ F0 X
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 B" ^; `* J. U, ^7 l' _4 s9 v- }原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339613 X! k. E6 V/ y' n) u9 _

) e2 P" S2 U, B0 y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 00:51 , Processed in 0.061574 second(s), 20 queries .

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