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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。$ {5 H* W7 ^: S3 @5 g! r2 ^6 z
+ C) D4 B+ N0 J0 l, ^8 l1 t/ _
一、数据插入 - INSERT
) O: l4 s  I1 G
- ?3 ^& X& M; D. G+ j  t# y4 c% R1.1 : DLang 插入数据6 [1 n5 e4 Z) H/ x/ K6 U  u2 n

- M- @9 w. b! H+ q; Yimport std.stdio;
& V, j( }- a! [
% }% ?4 S8 N6 i' r, Himport hunt.database;
6 J5 f9 }- B* i4 C( B
1 l  b5 O. Y* D" p0 Q# ivoid main()3 t1 D6 F/ Q8 P; d9 J9 M
( _, ]6 ~( M' d: a- b; c+ U
{
- h0 @1 ^6 a4 t/ O" i
- I# b5 u$ I& Y% D+ F8 Zauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
# p* a1 y5 D5 t+ v4 K8 F+ @
. r4 P8 i- Y4 }& z- H) E; Pint result = db.execute(`INSERT INTO user(username) VALUES("test")`);0 z" m7 w# W1 w1 _# u

; k$ d- n; |1 n! H$ C5 \* a// 打印插入数量% y2 ]) @& V( c9 c, I3 I
2 J% f% i9 H* \
writeln(result);' F! ]; l0 ~* w% Y# v" A1 p7 `9 D( ?
- L+ h: Q8 f( q+ G( v- a
db.close();7 G0 F4 L/ O- k% ^) {+ g! [9 F. e

' M9 z) k& z4 Q4 ^, ^}9 [. w: l" f5 V) S

  S% c- j6 Q7 u$ z/ Y6 z: Q' ]* J1.2 : Rust 插入数据
* h3 {" v# `4 b* V* u. ?2 V3 w, d5 h: N8 x6 c
extern crate postgres;
- F* k3 f1 s) T8 K' K7 F8 ]4 t2 ~/ J" j# M9 w9 k) o1 X2 H9 G/ N
use postgres::{Connection, SslMode};+ h/ p  x) ]5 ^. N- T& A6 z% \" _
9 ]# H) ^5 m6 `. x: E0 x
fn main() {
& u8 j" e# z' }. s2 J5 i. A/ g0 R8 P
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
6 O$ ^( i( g6 i: I9 a+ O3 N! M6 q( y9 I) h6 R
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();3 K, ^( c4 d8 x3 a. Q

- g+ Y2 D+ ~; F! q}0 L* X* x3 Y5 z
( a& a- Q5 t( c, z6 n& U. G
1.3 : Golang 插入数据
1 c- E7 x& n) Y4 K8 X8 G7 G# l4 f( q& G  j: v$ X/ j! b
import (: g( o; W" k: U- z

% R  ^; @% D# D& r' \1 u"database/sql"" F9 c& h1 v" r7 m! F: t* H* v8 j
/ o( T. Y/ V- E: H
"fmt"' }9 j/ A% v! h% C- T8 w& U& [- C. @
7 _5 H- O: Z4 L! S; P! N1 a
_ "github.com/lib/pq"
* \. M5 ?/ b. s/ S/ J' c% t) q! |/ s5 z& C
"time"
% c! D3 ~0 e9 y. }! W- L' B
% u# U, r' v3 N4 n7 m4 f  k"log"
# Q/ ?, V: v2 P5 t  [! u  W3 _& p& ^. k0 K9 W! P1 x5 H# I
)( y# z0 S8 ~. Y/ B9 Q) R# z" ~

  r; e# m% p0 s5 k0 W1 ~) zfunc main() {3 F: {1 D1 V2 e  T: p, N, `
) O% K; W6 p- v7 N( j
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")2 i$ Y& W4 J8 o' |
4 a8 c1 {5 \, P7 J5 a9 N- n
if err != nil {, M) O: U! z: ?+ _5 ?

! j9 @( Z# B4 ilog.Fatal(err)
" e; Z% n1 K+ P1 o/ o! g5 O0 q. I& ~3 p# r
return nil
. _7 C7 Z3 G; v
$ J7 W- g0 y7 L6 e}
+ Y) ~/ L( Y7 [( N5 b  ?0 W0 Q+ e- B: Q8 Z" t6 U. x
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")" J1 D4 e" W/ S% b7 {

+ \$ X: @# K: `3 C, A7 D8 z! ]stmt.Exec()/ x3 l; _/ N7 ~

) V# y) D5 b3 V, W1 I3 r% Xstmt.Close()2 x+ h5 `6 F7 `. H  U

  a0 m4 w0 x( S; i& \}# P) K! r* l/ L6 `' {

: f- y/ b; v. k) E* _4 f二、数据查询 - SELECT" |8 O( w- `- e1 t3 E
; R" F8 {# k( ~% u6 M8 a3 k2 \
2.1 : DLang 查询数据
  s5 z& _2 H6 M8 k  Z1 z& x5 R8 J" F* U3 w& m- w7 R$ A$ m  b
import std.stdio;6 _" Q) u" a5 v! F/ m
; I/ p9 X, M0 Y5 T3 B: r: S5 P* m
import hunt.database;
; K3 h, ^* W; S, d) f- C) Z+ _9 K1 o; }8 N7 q" Y4 ?8 L( n$ U) i
void main(): e3 y% e: L. h$ ~9 U+ I
" Y7 J& ^" {: _& u- U, J
{9 I& P& F. K; R1 P! z, e
  z* n8 X3 R5 h& K
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");" a6 }$ I& c+ Q* t% e# E" M
) M: o2 ]3 X6 R4 O5 F9 D
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
" R7 S6 C$ ~* Y  G5 j8 ~. z# w/ s; i* l" {
{
+ i: T& E; P0 l  g0 l" j) F, [& X
writeln(row["username"]);
. A; b( E( U6 o1 ]  \" J& K. l; ?/ j) W
}
9 \9 |4 q7 E# q' k4 `8 w) u) ?- a. ]* x5 M% A# m- B" o
db.close();( G2 M( e' z' s3 J. l; _4 ~
3 T! }- g; ?: k5 o1 r+ v
}
9 V  @$ ~1 f3 s$ l
3 D# i* S! y' v/ j2.2 : Rust 查询数据
. }/ Z- |" _4 v, u+ S4 _: H/ X( H$ @- [+ k; q
extern crate postgres;
+ w  `; {5 o4 f  a
7 \9 i2 X: d* n* p5 k, y3 b$ \use postgres::{Connection, SslMode};. V. U, a2 f- m4 ?, ?' b$ O0 a7 m$ m' ]

7 c/ N1 M7 t0 S7 T6 ]fn main() {
) F! B3 a  m" k: g" P% ?. }1 g3 S( N4 G+ z2 h+ ?+ L8 _3 ~8 o
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();  E7 ~, G+ ~" o  w# }% c" d

. Y! _1 S$ C5 j2 l# qfor row in &conn.query("SELECT * FROM user", &[]).unwrap();. q' y1 ~( M! r; S

2 e6 |0 u$ ?( a( Iprintln!("Found person {}", row.get(0));
2 @: J. U# Y' [; Y4 E+ w" x* x+ B+ f8 c9 W# w
}
& m* N3 y! t- p1 \1 B
1 R6 T5 F/ x2 c$ J2 h}! G$ o( k/ |5 C3 Z, w0 j

! q' j: X5 S& m  D: f+ u+ [1 x2.3 : Golang 查询数据
: E% ~4 K& x( ^- r4 s1 \
, n1 D0 U% u7 z& t& \; Cimport (
! t- D( v; v/ L: C' x5 U) A% A1 w8 W
"database/sql"
5 g, J' `7 z  @8 Z$ p6 g- H; b% _3 t  J7 ?8 Y
"fmt"
6 F  z. P+ T7 g0 k4 C
- R+ X! F/ f" E$ c& h_ "github.com/lib/pq"
8 X! P7 o( Y$ i% ]+ z2 P& T! E# o  R1 y0 ~9 S( f0 ]$ |
"time": a- z) w/ r; |( s& n  H6 o

$ {+ z6 }. w) z- s' v"log"2 b+ \! `3 }; n- }1 F! f

) [7 S% u  o+ l; \/ E)( ]( G/ }* F, _

/ H# j% H2 g% _type User struct {$ ~# @0 T& T9 j! A

$ |; h. F/ W7 A! F% H* y8 a- cUserName string
2 ^4 {3 O: k$ Q+ }- t+ X
, ~3 P% p/ G, C, ^  S# |4 w}
; C1 t) i( z: c4 ^* v: L0 k5 ?, q$ s
func main() {
5 a0 {9 m  K9 i. t/ r4 m# x3 h, }4 y1 `  W
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")' r5 k: c9 E+ s  c0 _$ B

* x. I6 V$ b1 Aif err != nil {: n$ D$ ?& u3 ~7 U) e3 [
1 T  u' O% F5 f2 x  F  M
log.Fatal(err)
' K* ~1 M  I) N& y4 }/ \8 I; t% o- C7 j, I+ A1 {* O
return nil
4 @2 s# d2 Z3 V% z6 N2 W' S
3 _1 C( Z$ W. b' x}2 A! @$ g' Y+ k) x
. r/ a+ C( P3 s9 k) H! V. i
user := User{}
5 L& A+ u# c2 V" @; Y0 r
2 p: u/ ~5 f5 s6 v, f6 E8 }stmt := db.Query("SELECT * FROM user"): v2 H) ~* d5 S$ H( e  I

2 m$ s: ~- x( _8 S/ V& a* q, Ofor rows.Next() {
! u, J6 {* P5 |! l# W) R7 N. `* R) P; B5 o0 x" `
rows.Scan(&user.UserName)  v( ?) U9 Y0 a  J, I

. j' F. J, J/ ?' [8 f- Kfmt.Println(user.UserName)2 ]4 F% G1 l. _2 z7 Y
: w, _3 a) ?3 E. a' g
}% \6 b" ~8 N" p
6 U7 k( a) f+ e" C# C
stmt.Close()9 ?6 f7 p6 L$ [6 K- R

# A; c8 Z) [+ b, s7 `5 l. I2 k}
: |' ]' P( `* o$ J) n! w# i/ |3 l! Y. s
三、总结
! M- |2 F! L9 M" \0 G% H( L3 K7 |4 Y: h" J4 C; X5 e( {
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
6 C/ ^3 ^& }: l9 t4 T4 V
: W" @: U3 g) M% b5 X( v; z7 t0 F( z这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
% x* `) V( O2 \- j, M$ [- E8 a
* F$ w* j5 F3 n! g* q! l  z$ G, _在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
2 Y' |. w7 Z* X) |$ d9 D, P
3 q: _; K, D4 s' Q2 B总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
" R  q# b7 l  r# W  _7 p! d————————————————
' Y0 d( y/ F, M" G% Y* D. Z7 A版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 l7 A" `/ k" ?# M6 a) {原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
2 @2 H5 g# o! d7 M  O# B2 W" S4 M( @1 u- s  F- a( w0 G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 10:47 , Processed in 0.063572 second(s), 20 queries .

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