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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
1 v$ B+ Q$ `* n1 K0 A9 g9 S5 Y% s. }- Q8 k: C
一、数据插入 - INSERT* C; h  y4 ]. t

! \% J" q  [- b: u' z1.1 : DLang 插入数据/ T  S  T" u% R7 L; y" ]
% L: o1 f2 u3 L+ e; Y
import std.stdio;+ ]% o1 n$ ~7 J5 E& A6 e/ o* Q

% Y3 V; |8 c. z8 s& Uimport hunt.database;
) x6 o; P1 @- O; B  m- O- ~2 @+ T7 e+ F. _: X
void main()
# E0 L% k! W( B  u& {+ _/ \+ e/ y
; k1 ]! a/ s6 E1 u{* T0 _& w- }( }4 s/ x
! G7 @. }, X- P( z9 z4 Z4 X
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
$ C2 V; B! b2 ?4 |2 Q) ~
8 V+ g/ K5 a3 [$ kint result = db.execute(`INSERT INTO user(username) VALUES("test")`);
. a- {" k, d0 L% o3 W7 l; K9 Q: q; F
// 打印插入数量: \6 D/ H: Q- N5 H8 w% S
- l  B' K) q- s) q) h  s' g
writeln(result);/ {9 r& r" r1 ~8 V$ a4 Y' ?* }& g
' }# I9 b- k8 ^
db.close();
! K9 W: L9 V1 S  l
5 q( ?: N# ^" u9 q( f" ~}
2 l3 z' {% C+ t" W0 f
' s4 X2 ?0 [) A- L7 k; q# Q- ]1.2 : Rust 插入数据, |: ]2 b8 z) K5 }! F
* T0 o. n7 r9 m
extern crate postgres;
- h: ]. S4 I' p+ E* t( M3 ~# F6 P1 ~, l* @# Y: f
use postgres::{Connection, SslMode};
9 ~& t& T/ u" w+ [2 Q( j5 a9 F5 k/ Q' A5 n4 f
fn main() {
( a4 j7 P1 w: n" N
1 q5 j% c# K, c# b, K9 _$ Tlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
- M# _& [7 z/ Y, u8 ?+ X" s3 H6 V
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();/ d3 s& r% V1 q  r% f# b5 r9 P

% J8 V6 q+ W. \+ [$ G8 n* K/ l}' k  M8 _1 k: `  j0 J, z

' `' I, V& s6 a2 j+ a" C5 v# n1.3 : Golang 插入数据# p5 A3 c! [. G* R8 ~8 y' D

* v- W( x  I3 [9 himport (
  }8 Z8 S* w0 O* H7 |" J: w* \$ z( B6 c9 ]4 R' s; f- O
"database/sql"
% g% C6 K9 x: w4 X5 T0 `' ]
  n' F- H, b8 X6 ~"fmt"* k) a- b% Y' I
9 w3 B+ }: `: N, A: {9 X
_ "github.com/lib/pq"
+ }% }0 o1 ?- t! `# G% z) F4 i2 _! b1 R
"time"
9 Z1 a$ s9 i( w. c
5 `$ J- j( W; A6 @6 ]. S"log"
! W# H+ Q! B* y- S# E- U( O
4 {2 `+ O6 D1 b' n)
& L  _* x$ B) n. `8 D6 h2 _7 Y& ?$ W3 S& `. l
func main() {- {% H/ |+ e1 b6 W* q5 i; r2 |/ y
! M7 D1 S1 ?/ t, v6 C
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
: a5 a0 K/ O: q  }1 Z2 B
& O* U, p6 |, |: ~5 Tif err != nil {
! T' J2 j* h+ l5 n: m, u1 z( `$ u3 y0 @2 X0 ^/ i0 i
log.Fatal(err)
2 g3 F2 y0 X4 Q4 I8 {
" u6 ]& d  I, p) M0 ?3 @return nil
4 \" F0 v" J  X8 I6 N1 Q  Z- r! U: z4 T, I/ n' Z* f( G
}1 [: N  y( ?, K
8 V) ^" G- D) Z- ~+ J
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")- I* @6 o' Z; }5 |# S

3 ?4 R* g; R! b% h( e; f3 v, Pstmt.Exec()
4 z" t9 L3 ~% T( D: G4 n# z9 E4 V
$ ~% B' l/ u8 H+ W' Estmt.Close()/ ^+ d* C7 A' F# i4 x- ^

/ {6 I7 [/ v: u8 n" k}
2 Y0 K- m8 P% f; z2 \; ?5 A8 l! X* {% f1 [0 c
二、数据查询 - SELECT+ q: A# V0 i+ O9 p: q
( y0 O3 ~2 U# r7 _
2.1 : DLang 查询数据
' r" v; [& J& f+ ~$ Q6 {$ N" ^( F3 S, S7 u* z6 J- b
import std.stdio;
9 c& Z3 C! ^+ v# k: F; Y0 v3 o( q4 d# o  ~# w) o' e
import hunt.database;$ j( X- v/ O7 F" P

# r* k. P) ]4 m& B) Qvoid main()( z' a2 `" e3 z& p$ y

0 |9 g4 v5 Z  ?5 \{
2 J& Q8 E- T7 F
9 s6 _0 K* j3 n7 z5 L! i" }8 Yauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
6 i! z6 G8 s: P1 T7 _+ a# G) g6 e+ c" f# v+ w* n1 s; _. B1 Y! V3 W
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
+ r) E3 [! C- D# K. H# R. K$ o7 F* c  Q* Y8 `; ]. k$ v
{
3 c1 D* t( F9 M4 ^; @
* `) ~! a4 l, ?writeln(row["username"]);
, O+ H, Y6 X8 B6 J1 R9 }; u
9 F. ^1 a8 ]* J) p+ Q}+ I" q' o/ R3 v# u. W
! c' {$ G1 K: \4 z. t
db.close();6 p+ T0 k" \7 s. W. s- S! E; L& q% E

. _0 E' s5 g/ p, q7 z. n! A+ ]}8 z6 h2 j, o& D2 f
5 l6 e8 A% ?# t9 V* U* L! W3 p
2.2 : Rust 查询数据
. _8 J! b8 i, g/ h8 j! u4 C. m- c5 a( F7 _) V0 C
extern crate postgres;: j: }+ S0 ?) ~* I  @# n  N

, {# n! w+ X; D0 Y" Xuse postgres::{Connection, SslMode};) y/ P) n. F* p$ h& a1 x# t

" g$ o! L5 \' N4 h0 D* Qfn main() {5 n. Z2 l' `. t/ K7 |

0 D1 P/ J: m! b  T$ W% l' W. C* klet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();4 ]' K" [- b) u4 x: p. t
5 g( q! J+ o! h+ g
for row in &conn.query("SELECT * FROM user", &[]).unwrap();" r1 f1 K! B. L% ?4 ^$ U6 d# k
$ z3 E4 L" }/ l4 X$ O  x( ]
println!("Found person {}", row.get(0));
& @5 k, T* j7 _1 e4 p
3 r5 v0 j/ z* l}9 R* d6 i& E/ g7 a- @) |+ }5 v

8 r5 E4 K4 r# o}
6 U: t( q4 s' Z5 H' S, i7 ]; J) [4 w2 c+ A2 w& l& N
2.3 : Golang 查询数据0 d  a6 \, ]: l& A) B0 L% |

9 y' q& B3 N5 {* r* Z: v5 f' ~import () p6 O; P! r* v8 F7 G  I" e
9 W/ c& W* z* L5 G8 X9 R
"database/sql"
1 P+ |; I2 e9 F! v
. ^6 M( i! {+ ["fmt"$ _, j* u* @1 o+ z

# v) a% `1 A  e$ n_ "github.com/lib/pq"
0 t; B# ?/ K8 C0 ]7 m% ], d: d: n0 y% M4 ?) Y% R+ o
"time"
/ H3 q  ]1 t6 p' v
4 L) T  ?5 W1 [$ L# P4 ~. f; J"log"% A7 s2 c' d. S# h1 f3 L  I7 ~3 K: B* I

: K; N1 s# H! o$ ^, S' n9 q5 o); Z( L: C4 ^& z& E8 w# U3 A

+ s$ G; ?6 x+ e6 W9 Y: Btype User struct {
8 @5 ~" s2 M1 u0 H8 k$ Z, ?9 H: ^* Y4 O9 }1 J/ [
UserName string
6 Y1 c6 ^' o& l7 b* P' a/ M; f( T  b) c
}6 v  S" o2 C' T, j8 X- v
' I. A; i4 Q' ^& @
func main() {
5 S4 H& b5 e+ U' G# u! b
+ C1 M! x# }- C4 d/ A  ]3 qdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
: c) N8 v6 N. u% o% R2 H
( F: n, q7 v, q, ]* e0 \1 a% iif err != nil {2 V9 {5 N4 c% W% q6 c5 F
' T( D' e4 W7 Y' g0 t1 H
log.Fatal(err)
" c0 \2 ]' S% q4 W1 w9 @3 R" ?* z. B* Q) _; o" A
return nil
$ U, q3 e3 z. p0 l( ~% r. h8 ~4 t
, X8 r, z  G  b- z' V$ K( `4 T}
7 g- |# P9 m! M1 c1 R$ [7 Z' C* f4 u$ ^
user := User{}
  h+ n2 b) u* O* @0 s
4 R8 w" O7 k: c2 N) N; Z4 sstmt := db.Query("SELECT * FROM user")
8 j3 C; F1 I* K! R1 v$ G( J8 D* \0 Y7 ~* O8 o  k, d1 `
for rows.Next() {
7 ?7 H& c' W) O+ w2 I4 I
% M- `7 D+ T, i4 `, Orows.Scan(&user.UserName)
0 u! }: V  l! @& H8 H8 F
9 Z0 S5 [( t' g+ u( Ufmt.Println(user.UserName), [4 i! m' R* f0 B3 E, K

+ A0 x6 s: @" E! O}; i, o" N3 N0 n. j# c0 G7 w$ U
/ ~4 @' b, Z2 D( [1 z
stmt.Close()  {* L3 K" O8 @+ _6 A
. ]5 N, V4 ^7 z) ~2 |% L
}4 C8 h" d5 a4 o9 ~
& U' U1 ~  m$ d/ W- F9 w3 n/ w
三、总结! ]7 Q7 I( D3 q# I

9 r- A4 G: ~6 v) ]对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
# j1 D) v8 c; U0 t$ |/ Y0 T4 K5 e9 f( d
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
8 g; w& o9 i1 [$ k' W# B% f6 Y( v4 }: a8 A
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
2 ?, S8 E  B% u  F2 j7 `& S  p: L; Z! ]7 H$ b& Q9 H9 \7 k: O
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。% S* Y+ Z6 V" {+ u1 w" P
————————————————
* O! a+ i! G  L版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ v. `0 |: N- {# a" E; y& |$ q
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
2 K' ~+ t+ \2 `
% e6 ~7 ~) C" [2 l6 h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 08:10 , Processed in 0.055632 second(s), 19 queries .

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