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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
: l5 b. }. Z" y; P) Y5 k. o8 I( X$ X$ o7 V
一、数据插入 - INSERT1 a# ]: x! Z) x/ A2 f
2 J6 F3 q2 I4 L5 H- [: i
1.1 : DLang 插入数据
  N4 _4 v! H( J: X6 `) ^2 A' X5 W1 C6 I6 n0 H* \( Y, D9 C5 B
import std.stdio;
$ X# k- g6 |2 q; Y7 ^
* f& d/ u7 @) V# E, i( M' Qimport hunt.database;
3 f, H7 J8 w8 [
' M, L  \3 ^2 P5 K) }# H* Kvoid main()
- c( r8 @' Z% T' A# w) B7 t) W3 e* ~# f0 ^0 B  E3 z
{$ D3 ]9 s- x) }
8 H) ~3 W9 L2 U) X& F! L( q
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");& w2 a3 N) u$ `4 Y* P- @4 m
) {5 J. u4 l7 }; r5 L
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);& D! c% k8 C) F- d

; w( `" Z$ b% v# X! A& @// 打印插入数量
# t0 @0 n# X; y0 y% x9 k5 r9 c0 D: ^' V* G9 t; A
writeln(result);) }5 j3 r' V; N. C& [( y
# a6 L0 C3 t3 O* F/ @& J
db.close();
/ C: K0 F7 O0 [0 Z, O" r! M6 E; N: T- y4 f
}! ], P* }' L/ _  {
% d4 S6 V# o" k3 P2 D7 v
1.2 : Rust 插入数据
; M  x# N4 J4 M, _& k3 V
: v( E, ~" n' W! k5 Sextern crate postgres;  i) P2 f5 u( f. w. G6 I5 w) O; S. \

+ P) {4 ]  g0 `0 |8 j( iuse postgres::{Connection, SslMode};
4 P- Y+ \% B! D8 e* Y! u8 d; f+ t% l3 U( l
fn main() {
' e+ C) s( i9 o; ]8 ~% A
7 V; w) k, P% h) u  s! nlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
% R. |/ w1 E, G. ?
$ z# P" ?% e) |5 \; [0 M$ Nconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
7 T9 d. a+ r& @+ C6 [4 R( f
* R' u) s) c. p% \# B$ ?}
2 ~( I5 Y& h, E3 ?* [2 N* p% N& k9 o4 h; d. ]3 W
1.3 : Golang 插入数据
: D8 ?3 q3 U/ W8 y7 w. R( _
& D, s% U+ k  K7 v4 `  I$ ^1 aimport (
$ g, w3 a8 B7 t0 b7 O
2 s% G2 T$ W; s, J"database/sql"
6 w' N( o6 U5 K/ v- v6 O3 S; O7 V1 V8 M3 q: v  ~6 V1 y
"fmt"
% q* |# P: N5 \. Y/ Y' E9 M. _8 b" P  I
_ "github.com/lib/pq"
1 j( ], o7 @1 Q' @  \0 J& W0 R8 U" ~& Q$ a) {. C& f. v
"time"
7 b' @1 `7 |1 M) b1 W3 M
# ^1 Z0 ^2 i  Z"log": `; c* p; ^% M# K! s$ H0 H

1 R% x+ D4 G' M3 ^)! i8 l, |. H% l. B$ J; F* _

7 ?- k: }) U7 w+ [  t5 e; }func main() {
0 G8 P* m9 b: ]
$ w! L& |0 p. D; C6 Adb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")' Q/ a0 {5 |  t) w+ U
& [: q0 {2 H" `# k- f
if err != nil {
, R8 ^0 o$ r$ Z7 V/ U
2 E' v' U" s' M' J4 C2 o8 {log.Fatal(err)3 n& Q$ W1 o+ w' G2 d, O2 @

2 D8 J% R) C- Z5 t! Dreturn nil+ q" N) q! w1 ~9 J) r

6 P; `5 K* l. v% S}
, z. s% L1 z( G. @
- U- o5 Z8 E# ?+ t, Q5 cstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")9 E0 g& T8 y, [' E3 `2 q

0 K3 V8 P( m: D4 Q+ t4 Ustmt.Exec()
, O# q3 {8 R/ W0 t9 x. J) a( G4 Q0 Z: K( T( Q, u
stmt.Close()& i0 Y( X8 \8 c; o
( r$ E  B8 M" f; H: k8 k( v5 F
}/ t% ~4 U2 f- B2 s5 t

$ m7 v2 Y; }6 ^" j5 N- p二、数据查询 - SELECT
/ p4 M0 _. D( u3 }* Q5 V! l3 X6 u! C: |# X: G# M9 w0 |9 f* c
2.1 : DLang 查询数据
( a' E) I9 n4 E; e
- T) O  p' u' ximport std.stdio;$ t  U8 w4 T' J  @
7 f7 c3 k9 ?: y& C- b' O( E- C+ K# m2 j; j
import hunt.database;0 X3 q- F% L7 y- R4 I) K! ~
. p/ w) i% a- {' w  C/ K
void main(); T* H. p, q3 Z, e1 ?$ J

  i1 W: E4 X0 o* ^{
1 o" d# t. |( [$ M2 w/ s! e3 ~* _* Z9 F. `2 J$ J
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
4 k; L; h1 D; L( T/ {3 v! }4 }; k6 s# B* l
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
, Y: l6 |5 A4 m" Z# ]8 q5 \; p, F! a( O( `# y/ o/ Q  `
{
7 P7 v9 Q, C/ y& p
6 ]9 o% u" A, a6 ~( E" W& H/ z* wwriteln(row["username"]);6 W* P! j/ V# O! L3 E$ `" _* h
7 [5 p1 |5 F" ]9 O: z
}
; K2 x4 T3 a. N3 @
1 G3 v# A' \4 X9 O; J  mdb.close();
5 k7 ~6 e5 h7 E+ c2 }
, H' Q* [5 F/ @' \( `}2 M; @' s1 j* X8 I1 S: W

2 F* I$ U; m) a2.2 : Rust 查询数据( L4 G1 a' ~5 |( _
: R& e. y" ^* O4 j( Q. T
extern crate postgres;+ H3 f* o$ X- L- `. {0 I
$ l  G+ H& c7 v' A0 y7 T
use postgres::{Connection, SslMode};6 T: G/ a- t" s5 R: z& |1 T& T
" s3 Y, c& T- F0 ]
fn main() {: t$ \2 P* Q8 J# w: Y( z
, r6 l8 j' E% [2 n& R
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
2 _9 Y. w$ {' A0 j3 Y% U3 ^" X; `- X2 K1 X
for row in &conn.query("SELECT * FROM user", &[]).unwrap();; g+ Z! p' ~2 ?& E6 V

9 e+ W5 M  I7 l1 ^3 M6 qprintln!("Found person {}", row.get(0));2 [: b# ?) p4 \

$ R/ T6 z" g' T: z6 G# W}5 _! |" ^" \. }8 k+ J

- i; \7 f* m7 k, R. i}; k7 Q) G  C- _/ K2 K, K& L
" U4 i6 b3 b! _4 x" l  Z- Q
2.3 : Golang 查询数据
6 W" {; a: z; F6 e8 E- w
6 y; T3 b5 Q! @1 limport (
3 Q/ ]1 S7 ]/ D. i0 E% I, T6 b3 }  I# G  |% W' E- o/ N- o  G
"database/sql"' q% R0 b. |2 D9 l
, C6 E& x8 n9 X- U& \
"fmt"& e1 f! U. U8 Z! H: p) K# R- f& O0 r

1 x4 m9 C0 [8 q5 G6 ^* B_ "github.com/lib/pq"# ]1 `$ b' w" t, P  S

( T: V  y/ D/ u- m" h"time", Z$ i' W1 |1 X* k: o: w! s! g

2 o' S2 O5 S% m' m"log"5 P2 |  I$ _% s$ X$ T4 ~+ ~
2 r6 s) {8 j: m' X5 h% i% ^" W
)3 M+ ^% H9 y& o
8 p# T: r+ N5 P0 n6 E1 C5 F
type User struct {
4 N4 Q) T- ^8 N$ T7 I0 z1 I9 v7 s  [8 n
UserName string
* G: F! {' F  i, G1 _6 m: `4 _4 w4 |! r' R2 `8 y2 B; `
}
! X* R# Z( V' R5 i$ u1 `
- e. [7 }% s! w+ @! D* _' A+ d+ xfunc main() {! I' Y. m5 h& Q' j4 u# c
0 p: ^! m1 g' r" v* Z2 v' ?  R
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")% \. M2 K" a  `
" x& N# o0 w9 |0 i1 E; r
if err != nil {
$ p( W7 i) R: Q; ]
# E8 R! {3 J$ s! |log.Fatal(err)
0 D( ~: M& a/ B5 C0 {# R2 H* [
& H. P* W( T8 D1 Z7 V0 Kreturn nil
$ W! e" S+ A' q. T9 a4 g' b2 @8 h1 m. B8 ^0 M* v8 X0 n
}
' }4 o& e5 ~* I" v' {- k8 C) e/ b
user := User{}6 B( O2 B9 ?" s

" u# o7 {  J0 J: p1 I$ Xstmt := db.Query("SELECT * FROM user")" ?  b. \* [1 L! r. C+ y( {2 Z" g

) {  F4 U$ K6 H2 C* M0 e. pfor rows.Next() {
( a& t* D) B. F8 Y' i; ~" |6 m7 D  A  S
rows.Scan(&user.UserName)0 T# l6 d7 N' r; ]5 |/ e/ @  J
( z$ I/ P' r  S" l  p1 b6 Z" ^
fmt.Println(user.UserName)
: s) j1 p1 y7 J. b
: L/ q2 \9 B8 t# [7 w" {) i}/ J7 A) R) o; @; M5 ?: F6 l
- R, b0 Q0 `: v  G
stmt.Close()
( d# s( C$ i# n  ^+ O+ H2 \/ l/ O/ p) o% G
}, p6 f4 _8 Y( Q' D8 r
' r! {" d/ e( x, H$ C* s1 k8 Z
三、总结
4 m& n  A. z" T, ?( N
& Y/ o1 _" x7 w" _& f  h对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
5 ~& e! V1 T, ?, w
+ e# S# K! H+ {1 T4 \. d这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
3 J' p. e# C, u& T: N5 H0 P: K) V) j0 o& m- n4 A
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。. s/ y7 `) O/ z1 |. }

* E# _! Q8 y) k) j' V0 l总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。: [: l1 S2 i' w0 r! L: e
————————————————! {& \' [: v/ v
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( n& g& T# m% _; W; _# M
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961* _) |2 Q( B0 G& D" Q

; `7 J8 E* q2 V. T' ~. ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 12:57 , Processed in 0.057646 second(s), 19 queries .

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