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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
. m0 T% K4 Q1 o6 M* G
! g$ ^/ F. Z' [一、数据插入 - INSERT
; b( R3 g8 l) J3 F& w
4 q# O& j2 x  i2 \# L3 `1.1 : DLang 插入数据
  f0 y. k' M# M3 L- w8 u/ m8 N7 W; W/ E/ L9 w( U/ i$ b% C) v: y! H
import std.stdio;
, I' o- ?6 T8 P+ |8 w
( R5 q) i/ {5 `9 q& T- Nimport hunt.database;- k7 m: g! k" K) X# t
* `! X" p- f7 C) R7 q( _+ s9 l# D0 z
void main()8 R( c+ b" O5 d) X9 ?
0 l* l# O$ K. f0 C- k3 t
{
: w& {- s& X. \2 J
) c3 @: v- V  x- w0 qauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
7 ~1 c2 `! h" r0 j- d7 D3 t# H3 c1 Y* V1 n2 f6 ~  E9 X0 a9 c) y
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);% U$ f6 J' C0 a9 O. ?, i' r3 p

  \7 A1 X6 G& r: t# B/ I// 打印插入数量
, I0 K5 K: B- Y
2 z+ A& o, y, L* Z+ L8 [4 @- Swriteln(result);
9 y* H- m% v! H1 E& S% N4 z8 n
+ A# Q8 e: Z" f  edb.close();# Z; h0 B8 H/ Q9 w; Z; n9 L
6 ^: k9 H4 z3 x0 \0 z2 _
}# W6 N3 j8 J) \2 u7 j

% Z% i, B2 a4 W' S( R! c1.2 : Rust 插入数据
0 H/ |3 N6 R# S/ W7 ~0 Y4 r" \8 ]% @7 \; W8 W
extern crate postgres;3 L2 i6 z  ?1 u' C' {: y

2 [* f8 \$ A9 t5 ?+ tuse postgres::{Connection, SslMode};! Q6 p# i2 I( |
6 |( _9 h* y. O+ Y7 ^! @0 |& E  r
fn main() {
. i, J! w0 z- U& d+ w4 J- t9 E+ E# i8 A8 `
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
" b0 D! U4 E/ H/ q8 A! L- b. V. X. P. w, H9 k- \0 R) V6 v
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
6 l7 G4 X: n  ?& g  M. P
6 \& q! Q6 B) ^+ R4 P}4 {" c1 {4 L5 q; X1 i/ |( ]6 W- M* @
3 P9 ?' e0 _4 ]. y3 N
1.3 : Golang 插入数据
) g, X8 s8 f; h/ T7 v. t8 a2 R+ i% L0 f
import (! n, B% K& V2 l0 V( |9 l/ [

: i- ?" L  K$ f( w"database/sql"8 E* r. T# |3 T+ m; q0 `5 e
% c3 r, L1 U- Q# M; a' t
"fmt"
. n: I2 Y; F/ ~# V& G  i( ]8 V4 {+ Z) Z9 U4 @: S6 L, o
_ "github.com/lib/pq"% ^" s8 ?8 w3 V* R' z: A. C
4 W4 {- X4 ~% b' B) x! ^5 o9 B% A9 z
"time"
# S0 t: [* E0 E- o5 c: n9 X
0 K9 M; q7 [( c3 ~1 @! G5 n/ E"log") w; U) j, h" E, q; g% g9 _

/ S% D7 C/ w5 s' C! t' Y5 j4 p)7 _- _) v/ ~; I/ e0 V
3 I. {' `: m+ ?2 r, i
func main() {
  d! v( X# G& `
9 B  @9 t5 X0 N6 V, X" odb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
% Y0 y/ S" I0 b: g1 u) `4 l% m/ [+ _1 A& u# \7 X
if err != nil {
" r1 O2 {, C- r9 |( ?, w
% t, j4 _; P- @* ]9 D  Blog.Fatal(err)
# J% L4 v0 b4 A# B# L
6 J  l. B8 k) M# y2 Jreturn nil3 Q# M2 z& ?% j, A8 L; f8 v8 K
# Z  a) ]6 I9 L! m4 ^8 |
}. v/ L  X3 n+ g9 s3 x4 U7 \% E
6 l& T% E" u/ N' e6 M  F# a5 ^$ `* x
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")( Z4 R6 R) S9 t$ V& P  m+ z
4 K$ j7 m" d8 m% a+ {1 z
stmt.Exec()
* J8 |0 O0 N% s9 \. D9 P- u7 s
! a& l7 `. }: Q* B7 L# t/ ostmt.Close()6 Y  J" I4 m$ ?! O4 P" v

- d5 k4 H9 t8 G# f}
& [, U0 t7 T: O' |9 r  j+ _. p) `) g" l5 \
二、数据查询 - SELECT
/ l1 r0 k* D" N2 v# q9 q3 l: F% k" r8 |) x( r; W  e
2.1 : DLang 查询数据+ C' |4 M' B% p3 d7 M

/ t  o. r9 y' himport std.stdio;8 T, ^4 I, K2 q) h

7 J* @/ C. e( l: d- ]6 Bimport hunt.database;& l* ~! R! _, Z- i, ], E- r" I8 S

6 J0 K1 q! M' T- j. i* ?9 D7 yvoid main()
, D) L8 m) w0 H
% r$ q  [/ e8 Y  D{$ N2 {* A( |- W3 \
3 Y/ x, \9 ^4 \
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");7 F, U" s& y0 s0 r
$ G9 X2 M2 s* N) q9 n  `9 O0 Y
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
: L7 k0 R2 I: e8 ]2 b4 M, T9 A" E" h8 U$ |2 ]# r+ i/ s  u
{9 a6 k0 a: ^$ s1 t' E1 k/ k, V( l" ?  V

( K4 v0 d9 t  [! M( k! kwriteln(row["username"]);
, V  ^3 n8 `( M1 e2 n; ?0 n' m! M7 p1 ?1 l- q& V) o1 A! H
}
$ W9 v! d. ]! r. A- ?1 u5 Y
. W- V! F" ~. w* m& f# Kdb.close();
/ H: l& I! R8 S# ~4 N3 k: g# s1 `
1 r; Y8 Z% X' ?- G7 c; P}
5 H8 p! S1 O- a, {7 U" E
* ~  {& R- W5 V2.2 : Rust 查询数据; }; q: L3 z& [- j

! x" S( ~) S, a) P1 b' F( K& O. `9 Nextern crate postgres;. y- I& B5 A- p

9 [! |  |0 D( buse postgres::{Connection, SslMode};
" L# {4 K7 c( C6 i1 g9 P# f& Y
9 g5 z# p  x2 Q: [2 _" m4 Ifn main() {
+ \! ]# i5 K6 ~( Q  H
3 Q& ]1 Z, p9 H3 \6 X3 x& i% U/ p5 ilet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
8 A1 b& m" m* s, B* }
( p* z# v0 ^% Z6 }for row in &conn.query("SELECT * FROM user", &[]).unwrap();
" K6 T; D3 n4 i2 O9 i1 w
/ k4 a9 P8 |/ L) E( gprintln!("Found person {}", row.get(0));' @6 a! z) [4 p  I1 B( q
# D; L0 |  c1 L, d& c/ T- V
}
2 b5 b7 e$ K5 J" K9 d$ i' _: L. E4 L4 C) x* g6 G# @
}
! d  C8 b1 l, M$ R$ P0 o" D' R9 @
2.3 : Golang 查询数据
0 r6 |& A4 t% F9 u/ n3 l8 E3 f$ X- i( e
import (0 F  N4 Y; C3 N7 i# M1 [7 U
+ z- A% i1 U# H' E( m# O
"database/sql"# o$ v/ @: E1 Y' ]$ p( T

. ^7 ~8 d# _. s, I: y- ]"fmt"
! w$ H$ z9 A2 {! G' V* k" i& J' z( _$ S3 c# m; i- V
_ "github.com/lib/pq"0 {' b- V* R4 y- q2 k" C

% ]7 C/ f7 z# |- K8 \$ X0 V"time"/ E/ \, f5 y9 j; S, N

. J: c& |- }% w# Q  C"log"
) Z; K, q: g' K' }0 W
/ ^1 n  Z! ^( D) X)
8 \6 }* H9 S! y( q
- p) f/ }$ D  h* q5 d" U% x( ^type User struct {
% ]) M0 n3 H4 W' k6 a# L; W* L0 l; S1 \7 h& d. z
UserName string
! V8 [* E2 l. n+ z
/ b3 L; c6 H: G% E' a) ?}
3 `% P3 Y2 j- U2 S/ m9 |
/ l" E4 B9 c  u- Pfunc main() {
8 k, }9 e2 p- l; p) U9 w; d7 {" X. |3 Q% n& ^+ r( P
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")7 p" M5 {) Y: G2 p! U
3 q2 ?9 d8 X( b
if err != nil {
. N7 q  b+ q- L. ^
9 i' m2 R6 ~/ u- Vlog.Fatal(err)
9 K1 B- M. J7 l. x/ r; f; M( I/ H8 e- W* q" h2 z8 g+ r/ v4 K% o
return nil, ?0 w; j* t$ r* Z- o$ P& f- k
. K2 ^$ Q; ?9 `- }1 H# n
}$ d8 F0 z* `; Z4 E  _
. H- Y- E/ ]# V
user := User{}# \( Y; Z, X& s& ?, t

' c, N- ]$ w* A+ ^stmt := db.Query("SELECT * FROM user")
8 Z& {+ h. T* d1 s& |3 ]
. f6 a0 g* c& v8 B) F: hfor rows.Next() {
$ O+ u, {6 z& N3 \
8 l+ S4 A$ G2 H) X7 d, f! h+ U: Qrows.Scan(&user.UserName)
3 C2 d4 [+ C! U7 z# v; a! y7 k3 e* e# c6 h1 y
fmt.Println(user.UserName)1 S' A6 X) d. b: a  E
2 i3 |% ^: b0 y5 a' w
}8 P1 \+ r2 X" I! k# ]% u( a
  F! f& l8 C) @* b1 ]" N
stmt.Close()( f, s: B8 ?; l& Y7 s% O

& B  J( @# x. g4 D( `; ?}' z2 _! F* t! R0 t' ?; X  P0 ~& f
) I: ~9 p: }7 s" J) U6 ~
三、总结
7 B" D, N5 O# J5 [, M/ U6 s3 a" f0 {2 x
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
9 A  \- P0 m/ p  m9 G/ t6 i) {
/ y1 c% M+ s3 p6 w3 J这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
* N( G4 D" A- o1 O
, [9 j2 S/ @. G0 s( G8 U7 j在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
; z  X; F' v9 ?  \6 J) x
% B5 ]& c! S# f( J9 {4 u总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。; }+ e" Z6 y9 [3 e- J
————————————————
8 K& X9 u: ?, y! x' p* F. h版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% _+ I% g4 r2 ]! p) R原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
1 x' n" J! C( w& L! \  V6 X: W% t' c: i/ |3 c3 m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 16:45 , Processed in 0.116806 second(s), 21 queries .

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