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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。; u9 r3 a! A4 q( E+ X" l
& H' q: H! h% B9 p5 j
一、数据插入 - INSERT" y" g) `% k2 i5 [
9 k# F# H0 I2 G; i6 g. B. l
1.1 : DLang 插入数据
1 E7 K" y2 N: Z+ M
) j% S; _0 K/ h' _import std.stdio;: \/ Q, t4 n% D) E6 a) g4 T/ ~

* O% F" F) h1 ]+ `  Mimport hunt.database;
2 s* X: I2 P8 F6 J. D- L
- V3 V4 W4 e0 b1 V! _, evoid main()
; [8 }! y! }; }0 Z" U5 H
" G  n9 r0 f3 x% W. b/ y9 U{
0 `2 h& i! W" v' `9 t/ x2 I
# x3 c* H0 N( uauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
4 R% x1 I; Q8 n6 \, v1 _/ r5 M' c0 i" W2 ?' _5 ^- L" ]' }
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
6 J+ S! [4 d9 }5 {7 h0 P5 S' j' j, }$ C6 F4 z' I' t5 c, p
// 打印插入数量
$ F/ W. v) j3 h8 c. O" E( N4 E7 T* F
writeln(result);
3 P2 y6 g6 G' _9 M6 V/ M5 V9 g: R% U
db.close();! d4 L; v' K0 k6 c3 P- n
; t  a5 }+ S- |  E3 D9 K* n
}7 w5 A3 y& n" X% ^8 o: T2 Q
+ r2 Y# |( @# G: x. Z
1.2 : Rust 插入数据
! i) r( N( m* I/ H+ x& g9 {" \; ~& x3 R' Q; _
extern crate postgres;
. o+ z1 r4 k3 C$ D- o2 {6 U2 Y6 W: m9 n9 ^7 {  a
use postgres::{Connection, SslMode};
& q! \! H5 a4 L6 z+ t0 m
) j% Q1 N9 V, ~: c! g- k: `fn main() {
4 K: Y% L$ f4 W
3 \- D3 B0 v, `; n9 plet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
0 n& f( r9 H0 h. b1 M- Z
/ x+ ~! R; M4 r+ Y# aconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();' A  b" r7 {5 `) r! f

( e/ k5 ^( p2 A, p4 g9 c( i}2 a; }$ e8 [& C' h1 w: f# s' e% N) @

8 \: F8 S2 {  q3 Q, v! K) c; w1.3 : Golang 插入数据) Z: j0 ]. E" v' A& ?$ c
- H' Z+ M/ W" W: i( ^2 U2 z
import (
8 J! f( P; v- Q) O$ s" a5 ~* A. A5 {" r9 j8 s3 s: a0 Z( ?
"database/sql"
7 H$ B. N$ G- x/ b
: q+ _% i2 w7 N7 a5 j6 `2 o" z"fmt", C, M0 t  h+ M1 A8 X
: o* |/ J# o4 h4 n6 r
_ "github.com/lib/pq"
( d$ I$ K8 q$ d! ~7 ~; @
# r6 U7 c1 n; f0 i- H0 n" Y! E2 j"time"4 F7 m% x. g6 f. K, U! E: E, X
3 [& m/ o- [# U- J% {6 j0 e
"log"
. ]% _8 x3 k; k5 s
5 t2 Q: R6 y' a4 g; t' ^4 d' k2 K)7 M! c! Q7 \1 U6 D5 G

% G9 j9 ?* t5 ^$ @) Jfunc main() {
5 J* O1 p( q" e# n  v1 D' I
- h9 z5 V% J7 v# G6 F! ^! S, i- E5 udb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
5 \/ I. U" q9 {) v) c% z% T+ R
if err != nil {: }  h; U( Q$ j: L2 e
7 f8 _! }% K1 h& ~* u* k5 X  W* M
log.Fatal(err)
, `# f( F0 v7 P4 ?) p& _1 d
# j. m% B3 P) _) f- e# n/ y1 r+ Greturn nil3 }  q' h6 d. `: Q  }

' Y6 P1 ]* P$ V' u}
% V1 R2 ?% w4 g2 h0 s  t- A1 ]6 k+ v5 j' N" @6 g; y
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")- _! j( P, I1 f% P2 X
4 `" c9 L1 q% w& x5 s
stmt.Exec()7 g  c2 M9 Y: J5 W

/ v8 ?# f, k3 U+ n' Kstmt.Close()8 P% y+ d# z1 R, Y7 w2 ~4 k7 l

, E0 z% l' l3 u- h& t1 j4 T$ r' w. W}8 e/ r0 `' y! y* A/ x" p) r+ G

- B6 K, e- I+ n" X二、数据查询 - SELECT8 \3 W  {- }6 M6 Y

4 l- m/ M+ v8 J$ m2.1 : DLang 查询数据$ b: e6 a( A* Q1 j7 F

3 J! _$ f* y' ]$ \) i, ~import std.stdio;+ @1 K1 I- g; i3 }8 B) E! X, ?* a
: g. C+ D, _, u1 R7 Y4 y" ]" B
import hunt.database;
0 C6 O: M. K, s: {, P$ `  D( ?  p! C3 e8 r, r
void main()- o+ s2 i5 [" q4 q8 {- R8 U# }
' o5 |: ?! g; t, E
{
- c2 S/ R2 F) {. p- m! K
4 U& K$ Y( \0 Y4 w* h4 R8 V/ [auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");; z! R3 @1 R8 n& U
' t6 W) m/ `3 c, c- R8 s
foreach(row; db.query("SELECT * FROM user LIMIT 10"))9 E) Q) z; l. m; ~, h

4 f- W  e* N1 l; o! {. Q; `{" H4 g0 T1 V/ g- l
* `, [: j- \( U* g8 r: O
writeln(row["username"]);8 V" d# N: S, Y! E2 u1 p& [1 ^
$ E  j; C; v( w5 x2 x
}
. i' v; A: ]+ D$ r, B5 O$ L6 b; g9 L! l. t+ r3 _+ Z
db.close();
& n) _6 Z$ r5 S, O6 a" V6 x
/ n7 R+ K( [' X0 o5 |# L}
/ b, Z$ G7 m1 U) r1 q0 L$ L! X. e. _) A9 s
2.2 : Rust 查询数据
) r2 Y: t5 ~! \; [5 N+ Z( ?3 Y8 L4 |% T/ X) j
extern crate postgres;( _, I7 g1 x, c( T& A6 V  y

1 l1 }$ `) M) q& t6 x0 t* Fuse postgres::{Connection, SslMode};
/ j! v, p; b% x! x( W5 M4 V. q8 _# J% p8 Q
fn main() {9 j8 R. r/ m& v

' D! x4 r8 R3 p# R" qlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
% L, h, |$ H, }8 B9 z
/ @+ ?# l( c& }& w# Q) Tfor row in &conn.query("SELECT * FROM user", &[]).unwrap();
% J& [; E& f9 f- X3 ?7 a  n# c- @* g, k
println!("Found person {}", row.get(0));
! F$ I* O6 P+ C4 `! _! t5 p1 j$ _7 D4 h* P. y' A+ A; G  T" [
}
6 Z2 L% Y6 g; S+ ~$ W
* F( F) S, {4 _% x" L2 H}' C- M9 k$ W% v; V9 q# l: G6 I$ @

) q& D" [' s7 G  l( ~/ S/ E2.3 : Golang 查询数据: ^4 Y/ O( @/ E) t( w+ ]; E
( p4 s) t) V5 ^& [& T0 X& h7 r% v/ ]
import (, m; U: a9 a. ~+ ?% \& P7 |6 j+ R

" [4 M. T. V* ]"database/sql"4 Z( G; w* G; n6 s& I7 p

# }; ]7 m) i$ }( w"fmt"! k+ r& @9 \; X9 z, [
5 s% U8 f7 U1 H# P
_ "github.com/lib/pq"3 g7 c( |& r) @$ c- Q! _5 G& h
( B' j! C2 h, Z# k
"time": h+ a9 ~2 _( ]) m8 ~8 K' X
4 m' ~6 {' D3 ^$ }( H( M
"log"
* U# s2 U2 ?! ]* m) U7 r" r" ]( L3 b1 _
)% Z  N6 @4 L. u- R1 K9 K5 x  S
- W6 ]6 g& k  N0 d" }4 r  a
type User struct {
4 c9 t9 X' J5 ~8 [6 B  b( E
8 ?- C, x7 Z7 ^8 v) @' `UserName string
3 m4 p" [" ]2 ?( c, T4 J6 i
* M! g% @- c# l7 Q# A}, J: U! B; P  @4 }% ]
7 T, B( r' {% u: }8 x* H0 ^
func main() {
1 k  i! T, A. a$ `# L/ H( [/ A; ~0 s7 e7 e! O) Y
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")4 T. E$ a  _4 Z* Q: m! p
; @: e, \7 ]4 c! c& y" z8 W
if err != nil {, M- W4 ?5 I9 G/ D# }  z

  z, V# [/ z0 s0 a  jlog.Fatal(err)
4 L# y1 [- E$ W/ d5 f4 _7 Q. S; m8 C/ G+ \" K3 R
return nil
: W1 k' ~# V; s- b% d$ y8 |* y7 s0 u8 w
}0 q# g% g( k6 C" g
2 ~2 _4 o- Z$ |0 }/ E3 G0 g
user := User{}4 m) q" c1 N2 g# u& Z
: c2 U$ T' H) g0 I* Y$ y5 d* T: I
stmt := db.Query("SELECT * FROM user")6 V: e9 C# ?0 e/ c# e3 |; M

5 o; a; z8 Q' efor rows.Next() {) u+ |# g9 u: r- q
3 I& e& r" Z. F& Y, v
rows.Scan(&user.UserName)9 {) q2 W4 C( G5 ^

, k8 i- y$ ]1 b* H& ?9 b" ~4 q- @fmt.Println(user.UserName)
0 U' P% }5 {! s4 e7 a
( r* a: p9 X2 o" w/ S}/ R8 U6 D* K1 a# d7 i  w5 w

2 P8 {+ Y0 }+ Vstmt.Close()
) r& n3 n$ i; C% v; n% o" C4 T- I, j+ p0 g
}
$ s2 J+ ~/ n, Q6 P# u* L4 a
9 `7 Q; ]* {% W% n三、总结; [. y2 D) J/ c( i

6 F2 _4 g% l9 ]/ y2 q对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。$ d1 Y; v' L/ @' Y0 R

4 i" z/ n: [  O$ m3 _. r这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
4 `: z1 d) _. d" Z2 j5 h$ t1 c* B- P. j1 y, ?) Y; B! ?
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
: }: }9 n4 d+ d, R# s4 c! [
' N) |1 N* F, Z总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。9 V7 d4 X" }! o% w1 Q" `* `
————————————————" y5 h9 n4 w/ s- c, a5 w$ w
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
1 z+ Q- D9 W0 C% h) M. o原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
' b2 A3 Z2 i' r" T$ V2 p' T. E, u- L- C, S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 00:36 , Processed in 0.128305 second(s), 20 queries .

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