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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。8 P. ?6 V' f9 J
. |1 H1 z/ b6 o1 j7 k& P: z
一、数据插入 - INSERT) ?' F  {/ w3 C% L# R

& q4 w% W- l% ?9 d9 }8 @1.1 : DLang 插入数据1 @4 P) u1 ^- q. A+ g8 @* ]& k- O

9 ~8 p2 @5 ]% c6 h  Q$ E) i$ p1 ~import std.stdio;
9 ^3 o# T4 i8 {$ m5 [  X! q8 U4 P, Y# s
import hunt.database;
4 K: z( m* u. n/ {7 }( \) Z0 n, o8 {5 T: F6 P
void main()5 _. B+ ]% G+ l4 E4 A. C3 P$ Y5 q

% W, s" Y5 U$ L& B{
, }( s& G! r* j) R1 @
; z9 y/ A" c8 _: N/ Cauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");3 k* B4 W: G! l. o) X! B
; Z; i) }# w  |/ T- }
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
" }) E/ u* f# v$ q6 l& ?# y' r6 J+ u# W7 x& F) r
// 打印插入数量2 P  i: f& N. J  L7 L1 f

( [7 z8 P9 a- g) _4 o% A: n- `writeln(result);7 w! |8 d( s3 d6 [
  X; ]2 L: P, O! e- B6 B7 v
db.close();* U3 x, s7 `2 v& O% f2 g4 ~2 z1 c
/ j9 V$ ]! n( i
}! m: ^4 V1 L! ?5 g% W

" |4 X' U! e- R1 P& F' B, ]6 G9 W9 o1.2 : Rust 插入数据1 Q7 X9 {& U$ Q5 j; S
# O* g+ c% t8 n4 E
extern crate postgres;
3 D: w) m+ I* z: @+ ?  M7 B/ f* ]! L6 a
use postgres::{Connection, SslMode};
( N% _% Q' R! h1 D. u4 w
( m5 f. y6 w( y  ofn main() {6 ]. k0 [( v' X
, I  a) S* Q; V2 \
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();1 Z+ }; O! ]3 y" l$ Q( v' g
; [2 P3 c/ l7 K/ M
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
5 {* ~# n7 v6 M) d+ X/ d# [, Y8 h
: J/ g* ?+ L' S0 p$ q9 `}
5 r- K' x0 T4 V; x4 Q4 V( Z, j* C: j% S" p
1.3 : Golang 插入数据$ @! X! {, \0 U% Y( W

5 l' ]( Q8 y3 R/ oimport (: \1 @+ P( E# I

+ ^% n) t3 S9 e4 }; }7 }"database/sql"2 _, B3 s, O+ J" |6 T; H3 k

1 B5 A3 z% [% K2 q"fmt"
2 `! w7 I4 j: D3 Q+ d; c* u" B& `. K! ]: W4 Y* J# @; |
_ "github.com/lib/pq"
$ {- O) L0 w) L& K7 c% y" d$ P; G
"time"- k" z' ~( b# X
( ]2 O+ H& J) e3 V6 ~) X8 O2 t
"log"% S/ g5 T$ q4 V4 Z. {- ^0 r

. R3 B8 l- h; F# s)+ n; ^/ O0 R& l' N" A1 V
5 |% v8 A$ W3 F9 h
func main() {3 K6 H7 p8 F- z
+ a( k, y. p1 {7 d% l
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
/ l7 }1 l2 \, I! }
* L: j5 q8 f0 v7 K* d# Lif err != nil {
( H0 }* p/ ]; J1 |9 n: g6 G! [
/ V- ]' T5 M) hlog.Fatal(err)' s% s0 }' \& i: r0 O+ X
$ ?- A6 q8 M6 o/ ~8 z
return nil' A: j/ a0 ?! e, k6 ]% [' F, g3 z

6 @' ^( g& M' T5 O}; ?8 b0 {0 C2 m: I; B5 ^
  {. T, S* y' b
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")7 |9 @; d, ?3 s% y/ v6 E6 F
4 U* I3 s$ g% D/ P
stmt.Exec()
! c$ m; O, k7 L1 P
+ F" d! X$ N2 x+ K. g2 W# d$ gstmt.Close()1 B& O1 |8 _1 W- ?+ C

/ f; f9 d# r+ Z5 t6 M( ~}  Z$ G& s. p  g& G; E9 j# d6 h1 Y* G

0 ]. H0 z: B% [6 E" a' d! y二、数据查询 - SELECT% m# q+ J, A: x. p) H' W2 K5 Q" t0 L

7 T4 z0 {3 u; {2.1 : DLang 查询数据
" ^) [8 d) y2 P0 v' G) K. y- v' V# ^/ T* `9 h
import std.stdio;
) W' ~5 o) B) v2 Y+ i) w. G0 \+ p; B3 A. U8 C6 m" t* {
import hunt.database;$ q& d1 z, Y, K0 ~

6 ]6 \2 a) Y6 yvoid main()
- I6 V% N- e" J/ ]/ I* b( A1 D5 D  U% T) [& n1 Q5 y6 j
{
& m8 |/ I9 |0 T$ Z, ?/ H
4 }7 f. k, {# g" Y( D5 Xauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
/ b2 `6 |' M7 n* u0 U4 i' D  _
/ M1 }% m9 h# P& k% D1 Kforeach(row; db.query("SELECT * FROM user LIMIT 10"))
5 K; m" A  D/ I7 r1 |2 v, z
4 D% g4 J/ C: |{
& }0 y) c1 l  E9 b# f8 c9 f  p4 E. w! r5 B" s! W. R
writeln(row["username"]);1 v) C4 `0 }9 ?& ^$ H4 s% D. L: G
$ Y: c8 @( e! j! u" T1 z4 f& ^
}% |3 f& w9 v/ i* m) e1 U0 M6 U

' t/ R1 z* C4 w. T! N, }db.close();
$ ~8 z; h9 e# v3 o  F2 ]
  O* |4 k* y) ]: n8 }$ t0 M; q  H* m; u}0 Q5 H! U: e; p* E( q! y  e
7 {! K5 C1 @. o- M/ K# |% O% i2 g- p
2.2 : Rust 查询数据
- H# [/ x, ~( |2 {0 D
$ V# b& Q( f% O5 ^  s  O# oextern crate postgres;
3 r' q" q4 q' z6 A
# e& `" G* R8 d) Fuse postgres::{Connection, SslMode};
9 t) ]5 b$ H  T, D1 m7 `% c
& p8 d8 U! S5 x/ g; K' L+ efn main() {
: v( m, S) {# c4 a( j0 m: Q0 [7 a1 s' p# Y: i5 K
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();0 K: Z, f% W) ~+ Y8 C9 P! `
5 x6 I- h' |1 R1 C! v0 X) h1 `
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
( a0 t( d6 T: c8 E; |$ T( p0 m: M7 M0 H% v# A
println!("Found person {}", row.get(0));. j  A- V0 w) w0 Q5 f

2 I4 I- {, j& m}7 Q  B, m) E/ l% W! x

- G: h, c) @! ~& n( @}. F8 h+ c( x- x' h

1 E! i9 K  N; ]- r+ A# F2.3 : Golang 查询数据. p% a4 {) r$ p6 x

% d  u8 a* Y6 zimport (
  F& q  @4 n' @6 @; q3 S  f* T4 z8 {/ b" l
"database/sql"6 ^$ X& Q) g' `2 d+ V4 X5 _
# T! k- p2 r5 Z( v2 ^
"fmt", p- U4 ]" t! \3 j' g

! r: c, r& ^/ T& J+ u! [_ "github.com/lib/pq"/ K* U& w3 _) z8 I! a
  L; T" c5 b, ?( K! G6 X* |* R
"time"
% W/ i% g8 R+ x( `( @8 O; x: c: K, J$ {# b0 V  P* A; }" Y
"log"
2 G" T4 r, U6 z! @# z# f% x
6 w$ Z4 {& q1 x* B5 t)
  y1 O! ]$ H! e$ a6 A& V
1 j# L  Q+ Y( W7 t4 qtype User struct {
. @- }6 D# t% h
; t+ e+ N; D* |4 B2 T: hUserName string$ p9 b4 Y' E  x( w' e1 v7 Y

; \- z6 I4 v! E4 ]0 h}
1 s1 H& A# _5 T; w0 z8 S3 z) Z. p9 p
func main() {. |0 W" |: }9 @! h. I" y- E* ]; _
) C/ P! X4 J0 J: I  Z1 {/ S
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
! _% _6 j, W7 A) o/ i
/ m1 F+ l' t  g4 @0 Y3 P  `7 u4 ^if err != nil {& O+ r4 r/ e* Y
! ]) q/ t7 f& @
log.Fatal(err)
+ k% P+ W! M' f  Z2 E3 K
( `* O+ V- c, H: a; Lreturn nil
; p" t  |9 P) N2 ^) [9 ]$ w" v! \; m8 V6 D/ S
}* q3 L& P& |: U- c( Q

2 v0 F# _4 ~; H% d' f$ ~0 C  Juser := User{}
" S) v9 _6 y9 N1 Y/ [3 }7 c0 J1 y9 k' [+ s$ j
stmt := db.Query("SELECT * FROM user")
9 ]+ T4 l/ G2 [5 ]* n8 i+ o9 W/ v: ?( E% g6 z' Q4 c9 i. g
for rows.Next() {
% m8 [# N1 s0 z. M
1 e: |% v4 s. |rows.Scan(&user.UserName); w& E# r; m6 N+ `

" f: T  B/ G$ r: p% Q3 u2 \/ Sfmt.Println(user.UserName)
6 s: s( m/ D. y! {) o2 G& I: Z5 h% r' W% Q( G7 i8 ]# Q
}
3 d% L3 M- k8 _2 W
6 ~. ?1 ]% `. a* Y8 d7 }stmt.Close()
& }  Z: ], ]6 B# E$ @
' F9 H; s4 h$ a1 f/ |7 j}9 v: m  B$ b2 ]6 c& O0 O
1 L/ ?: x) W) Y2 K: W+ I+ |, @
三、总结
4 ~: [& N4 Q1 i) D1 Z/ I  l# u) f7 n
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
* w6 R1 T3 g- u. [9 ~- X3 I) L" a) U
& m; J3 D' d6 I- c这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
5 `! A# ?  C# Z  ~& f) O- S, c% ^- ?0 W
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。) u7 p8 {  D# Z7 ~0 e

5 H$ e  J7 I( ~( t" d. h. |总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
2 h3 q' Q, J! p' ?  Z# u+ T————————————————
1 M( f! t; S0 h6 M. A4 j, p6 V3 H# u版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
. q# k$ f" M  ]3 o9 v. j原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961! \1 N  G6 D2 s- D& O# u
( h9 d* q6 k" @8 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 11:26 , Processed in 0.052569 second(s), 19 queries .

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