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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。7 ~# Z/ e! h! [% }9 X

' ?& r2 |; u' f7 U% _一、数据插入 - INSERT
; y' N4 L9 f, x
& @$ }- |( B; `9 P1.1 : DLang 插入数据
6 s5 m, W6 q( P! E& {" g
  I) f$ x. j1 g/ N% Q. Iimport std.stdio;2 v3 a1 F' _) L4 f! S
6 |* Q- L) _& \
import hunt.database;, E+ m6 M* v! K  t1 K
; W' R* I8 A6 s4 }; @# `2 H
void main()! Q) G2 \+ f) z5 Q; |
7 t& v: H# \" |3 d; @$ n! Z
{
) \) v1 V+ f0 B3 x: m
  \% x/ J. j" S6 V% I( Nauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
9 Y- g# o4 t0 c
. S  |( ?* }- X; P8 ?int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
# Y& K2 m) ~+ i" E6 @4 f' J6 B$ `( q3 m9 e5 r
// 打印插入数量
. D# f5 q9 |1 ^( T8 n  }. @6 T8 G$ ?( s3 P* }9 I( N- D0 g
writeln(result);
' [; D: A- `9 I" [4 Z3 Z) A6 d; M* k" p! Q5 ]
db.close();
$ I7 k9 u( N7 ]% [
$ S  e# a# {( {6 G- X, i- h}
. u% ?: X+ x1 R- t
  b! M: ^. p5 M8 _: c! f. _, _1.2 : Rust 插入数据0 G& h/ g3 x9 \/ h: L4 v, E
6 H# n# Z6 |9 o: B! q' M  e- |7 c
extern crate postgres;
9 i- O$ k/ D1 R$ }3 t3 U. i
! p  u5 `$ r" p9 S" _use postgres::{Connection, SslMode};
9 K4 F# Z1 h2 |2 W% ?( l0 n. x! E& Y, R. t4 ^. N$ r2 w: b. v
fn main() {& x: R& g/ u4 f& x' m) K3 H$ X
9 m8 K" k% o1 H) o
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
8 ?& y. A; u. N, \& u1 Y( M1 A( _5 ^) K: q- m# d
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
1 T4 ?9 r: L6 N$ g+ n7 Z
7 X( k& q1 j* z  k; {}1 R  W# Y8 A) G* u, A9 p7 K, C
3 Q$ ?/ W& q# |" d
1.3 : Golang 插入数据- }8 m4 u8 `* b/ `  M
6 F' `  M* A( Y/ ]/ M1 g
import (
; A  b# U; n( `- N7 t% _# }& X1 S1 A0 \  U7 n/ G# s- R. q1 `
"database/sql"
& u% [2 a' P: C* B) B1 K0 ]
1 Q0 z3 c$ d; t# N2 V"fmt"
: Q+ z: F+ B3 S$ I0 N! Y* ^! D( v& T9 k7 h% S% p0 b
_ "github.com/lib/pq"
$ b5 @+ V1 h$ b9 k7 s* ?' Q6 x6 v% \' |! T, M' b0 h
"time"
0 B! l' Z7 ?0 U% k  y. K; J( L/ c; }0 o. D# b" W: ~* f* }- P* M4 G
"log": [. M  U* V; Q4 K: `" P; S
6 t5 o. N+ _' k  c, X' M1 ~( G- C
)7 G' C8 y) m0 d6 W5 p5 R6 d
5 C) W! u; Z: }2 g# |2 t
func main() {% Z. z1 `4 ^% w% p

/ e( t/ e0 h4 k/ u$ jdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")6 z+ _4 |9 ~4 `, h0 i

( i& t& f6 V0 L6 J) P0 j% {: ^if err != nil {
$ y9 c9 c8 y1 _
  `( k! w: J. p, }2 B* Alog.Fatal(err)) u( m6 Q- S7 \' e7 |6 L4 U+ {

5 n* x' A' `. d4 L: _return nil
4 ~" O$ Q3 y. h' ?+ K$ I
8 {) R$ {: l& O) v6 p$ D% R; N}
, q$ i4 [; ~5 a1 m2 R
/ b/ e2 Z3 j, {( h9 E' o( ostmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")& T7 _$ d! ], x- ]5 |0 d- e& t) ?6 J
  }1 {. s' g5 a' A$ f! K" r4 V7 H: ~
stmt.Exec()
9 j1 H+ x: L; X1 q8 v! r8 ]' K: a) _$ G+ o8 z, ]
stmt.Close(). J# Z! o! q8 J1 D# N1 O

$ Y) j" L' x/ c" [2 `7 g# b}' I3 w9 @7 v9 Z' {1 z% g$ s

( Y0 s6 `" z+ ^1 H二、数据查询 - SELECT
6 b6 I0 e" d" K
/ P& f' v) M# z% y2.1 : DLang 查询数据6 w% ]! m4 ?+ ^. W" W0 O
( m  Q' F; r) B) i( U& i; }# ^' v5 [
import std.stdio;/ z+ d3 W4 t  J# k& ?
+ `8 f# c  p( y; l. k3 i; s
import hunt.database;
8 D$ ~- T0 z8 j5 b  d( T% f" x5 p' N
void main()
1 W* F  D) p# n8 X' f7 W( l! E7 Z; F; O. d
{' B7 u& s) l" a! ^3 w
, u  i) p' f7 O9 o0 A$ f- P8 P
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");  Z* m; c# f% z+ M! \, T
$ F- V! c* u+ [: R* v2 `
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
+ u$ b( L% j8 m! D
4 y. u1 v% o' R8 Y. r! `+ y% K! l. i{
/ P' g! u6 p' u5 M+ R
/ p7 N" k( z+ D$ q* |& y) E& pwriteln(row["username"]);, r) s* P5 H2 F  ]- Y6 k' g
2 R" B6 e. m' D# p
}0 h# |  k& l" n
) ?# g8 J. ~# Q; O. p
db.close();; @* h( K' o  p9 Y, y

5 m1 M' O  F( g% @! |: J}2 A- p' Z' H% c- x# G! Q4 S, K
' [1 w$ h+ t' |' h1 k: A& [5 g& q) i
2.2 : Rust 查询数据1 C8 q% Q2 W* R
* u! ], F; K/ n+ u- ^7 a
extern crate postgres;* }8 |1 z/ W7 b

. w# W8 @( z5 Z( b7 v$ B" ^use postgres::{Connection, SslMode};( }! I8 K" O& m9 |, O1 |
: u& r3 M6 h8 r9 W0 W# J) e
fn main() {
6 W6 L& m, f& I
6 L) ^4 l2 u+ C+ a0 b. vlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 T& p" O. q1 i' b; z" |! `0 \. H, Z2 y
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
( u4 A3 t) S& ^9 o, L
, _7 n+ `, r9 @6 d9 E1 xprintln!("Found person {}", row.get(0));
" D$ t  y/ E+ T2 F- K8 W) ^* K9 R: E
}
% u( o- `6 E; ^
$ n2 b) h" J- g7 X$ a$ b6 |: v& P}8 v- l2 K; F( P

: A5 L* Z$ D- A6 J4 L2.3 : Golang 查询数据
2 I$ w( C3 I3 Q- c
3 Y7 a: Y5 v' A+ gimport (
1 ~" {5 b# @: a! M4 \8 p4 c" ~
3 x0 l5 f5 U/ B8 d2 l"database/sql"( u- h  d6 ~/ G
4 I! z6 W0 `8 i& I- x2 _
"fmt"
- F% j; I6 _: `2 ^6 P) ~7 C
7 ?% X, E" ?$ p# I- ?: Y_ "github.com/lib/pq"# c9 `! P/ |- j7 N: j' E

% T8 J1 G! @& c"time"
& L" W2 u8 n' A. o  \' f, \8 d( h! t1 k0 }
"log"
4 d% t0 U! w3 i2 y- I& x/ V$ k# n0 `: Z/ Z
)
' ^* w/ B  n/ p% b( {3 R1 s
' O3 C) g& R5 v2 \3 N. ptype User struct {! Q9 v) e! J4 v2 M6 m0 E6 i, |

& Q& R6 n' W! \9 u: pUserName string
: o9 Q* U: n: o; Q, H
7 }% m4 d' [$ X/ F7 _}
) |: D, N! e) [' a6 m% t
3 G8 l& q! T6 Q$ B: qfunc main() {3 W) L; P$ n) t" u! v* Y2 g$ `

' U! A8 y  Z  T2 H& odb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")7 Q; X  h3 h% {: ]9 v3 }" l
' C8 q5 r- G: y0 p2 V6 `8 s
if err != nil {
+ o1 @" ?, T" v/ H$ w6 b& y
# e5 L  I* N# Glog.Fatal(err)
" H8 z+ @" L/ t+ E  o6 x: J# }/ N" F7 a  O0 ]8 J" q
return nil
/ {/ X' ]0 D' v- ]/ I9 @0 v  M0 r6 y5 P! m: T: |( |3 y
}
6 m2 e1 e4 M, u5 S6 }4 o* U' f, O/ C3 ~6 n% P$ W/ H: \5 u
user := User{}- x. x2 y; Y, q/ u! D

9 N* ]" W& V% \stmt := db.Query("SELECT * FROM user")' o( M8 K7 {5 P, d, `, Y/ S% r
4 r# U9 A$ Z; ^/ S0 j
for rows.Next() {
/ e2 l9 t/ g$ p& T1 d
4 S2 u6 x0 f0 S9 `rows.Scan(&user.UserName); B% R6 ^4 @, I4 x# g& \" Z( ^! {, {

" ]0 L, r; H. z& T/ a( v! B+ `fmt.Println(user.UserName)
- D9 I! c: ^7 g
3 _7 V. K. x+ B& ]! `& u$ |4 z}
; f: r  x- ^7 P5 a3 j
! f9 m0 N1 V! dstmt.Close()
2 ~' r$ U. X5 Z. D1 [& i# s3 w/ v. z  M6 ~  _: _
}( G3 ~& x  g4 m4 q

9 e2 x/ f, t8 c! T% h/ ]0 k三、总结; a6 K% s) D* ~
$ H4 _3 l8 Z- ~1 _; p6 t5 U' D
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。9 T0 L4 J- w9 p/ d: @6 N2 X+ q

- O/ _% ?. _8 B& q! F6 j这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
+ ~, ^8 b: V$ g9 `+ O1 D4 i/ G5 _5 C/ W+ u
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。9 R- {3 Y0 Q( a; m0 B8 U4 X2 Z
6 m' D* G; U8 ~; \1 U0 a
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
4 n& L; h/ ^5 m0 e————————————————
7 O0 x" J! h0 C5 T4 J' Q! a版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# c' \+ K8 r; N0 C8 m
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961, p2 J# X/ P. v1 A6 H
2 z( G, G6 M5 V4 w2 X3 L5 k3 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 11:03 , Processed in 0.109360 second(s), 20 queries .

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