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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2022-10-26 00:48:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
$ K; E, y% Q) O! k
- I& E: o, [) j) l' a一、数据插入 - INSERT) p1 m, L: B4 z6 z: l) V

% Y# P: o  ~8 {' {6 q% V0 _* U1.1 : DLang 插入数据& b% A6 a' |) y
3 E! D3 m& v! `  C8 [
import std.stdio;6 @. l' V* Q1 }- {: \
5 N0 e' j  {0 j8 V$ o- Q
import hunt.database;
5 X* ]0 A5 Q: [
# m; h( g% ]3 C3 hvoid main()
! `% \3 G/ Z8 D$ y% f
; v% \! \7 r% x! ~{
2 m) D8 o' C' m' x4 R) c- c& s& x6 Y! C
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");7 z! s; x2 A) B8 B8 ^
1 l& ~( n0 k: }
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);) i: j; D' W4 U) U

4 ~9 {* |  i( B1 M6 D% w) ~# J0 T// 打印插入数量3 i/ U" \0 u% t" e, S% x+ A

; }: F: \- a3 b( r0 [# ^' zwriteln(result);6 k- \  _& K2 b

1 c: @. W# [+ I3 Z1 E/ Kdb.close();
5 l; P5 [  q, I; _0 i
4 ^! g& S  Z* K  z/ ?}
- {8 R7 L, [. a, ^' I( x# a9 _* }
1.2 : Rust 插入数据
2 @$ {  Q! v* V7 q! s% ]- g+ Y2 J
* s+ K: F) P0 T. X, ?extern crate postgres;- ]& C( Y. ^' h) p6 {7 T. I

# t: M1 {4 P7 T1 w. tuse postgres::{Connection, SslMode};. i8 B' P  d! ?/ |9 ]- G# C

1 z" R- Q+ A) S- q" {( l+ T: S4 Gfn main() {
# y7 Y: `( @: M0 B4 s- ^0 ^. l# w3 o% h2 J  A4 B) m# K
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();6 ~) C" p, v- g6 B0 V6 L$ _( M
  k  `& s  k7 j) I; V( o( _
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
9 D  Q4 B+ _4 g+ o: ~8 k, V) q: Y1 T" C& H, M
}& s8 c7 K  p* E  p' Y+ d
1 R4 O7 k. l) l6 h- U
1.3 : Golang 插入数据+ J# |% d9 ]0 T7 H

* S# T# z$ m2 o& A% m5 nimport (: s) p5 b! ~; K9 \) X" X
: j* l8 O. J; e0 p9 L
"database/sql"
' J% J# c" A) Q8 I; k) B# O. n. I; \( t
"fmt", v- L+ @; |+ L1 b1 _2 D/ Z
( H+ N2 h3 [! L0 Y! h; T9 P. w
_ "github.com/lib/pq"6 c2 X' V7 X5 o0 R: L) ]: p

4 L# P& F- O3 |# Q0 `, U! {"time"# Q  U, f( l6 O* q# o1 D5 _# |

2 I4 {& n$ V' C* c" F3 W" v"log"
2 O8 t0 l& J0 w1 H# P4 G$ I5 c) z. I! F3 B- L
)
& h4 y7 A- [2 x  o' w! ^$ m  b  P2 t% p
func main() {
* |1 D* C1 ~/ _% M
' h! S8 |, Q+ {2 ]( Z6 p' Udb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")# @4 c; p, h8 k7 Y; ^& Q

$ i/ G/ l- c* a' t% d  x3 X# Sif err != nil {
' T/ m) L- E+ ~9 @7 h: {' Z2 x5 @1 {2 J; ?' }, i6 k) d
log.Fatal(err)
  n7 J" Z) O2 ?8 s" ]% L8 R+ J, _6 |0 n0 ?+ n
return nil8 \, Y) @% A+ V+ p

( q6 F% T2 Q# S. v2 b}* L( r% D3 d$ a, v+ a, w

! i1 M! }1 h$ u! {0 o( `stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")' s5 Q# c7 k8 d
* f- t/ ?  l" t, W" ~4 w/ z
stmt.Exec()
2 g  ~. d1 j4 C5 Y3 X5 v* r; J" m, t9 g0 p
stmt.Close()
* ^8 Y1 o3 v# f# g% F& |- R6 J7 B! n9 E% g* i& L5 U1 |9 _
}
& W3 j- W! ?. c9 f
5 J5 g$ s. I  Q二、数据查询 - SELECT% }6 E/ X& q$ g
" G& [" A& F5 {
2.1 : DLang 查询数据
- c5 o; P9 y) {$ v) U, c# R1 X0 q! q' j
9 G* L0 |2 k9 Q& z4 Dimport std.stdio;
! |' r9 b% Y: }  ?6 y* k$ _* p+ G; D# g, b4 ^0 {9 G6 L
import hunt.database;
7 r  M+ ?4 A3 T1 v' Z' g0 \" v. K) I
void main()4 G7 @8 V# x. I7 p
: n6 A* j  b! s8 l% o, d" m# t5 ]7 b
{
% f2 o" {# W0 u
$ z# i: H# v0 c; B' U: y, s4 Z$ Iauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");$ H. p! ?& S& [% o: F; k
0 t7 w4 z$ u4 k
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
; D& |9 r, G1 ^% }+ s
+ g' p5 ^- L) G, w0 O) i{
/ U# C5 j. h* b* B/ o, v1 N  s! }0 ]
. t1 J$ b7 N+ bwriteln(row["username"]);
8 `: j3 l& t+ j) Q" ?4 j/ `' l! R! U& D6 F: ^) p
}" E, g6 Y4 }# O9 A9 z8 G9 D& D
% R) S) H4 H$ I
db.close();
% h/ t" j5 J4 ?6 S3 Y" Z, h: {/ }' s1 M1 z* @# t& A( L: ~9 i
}% ~% s9 t, F" J

7 L) C( J3 U) u' O2.2 : Rust 查询数据/ T7 r5 V9 z! K) o) [
% ]+ y, [: q( \9 c9 v# h+ T" l
extern crate postgres;
' W- R4 \, X' ^4 }4 u( ], W" _! W" s6 }' G1 z
use postgres::{Connection, SslMode};
, _  ^- Q, B; T7 d9 n6 D8 P, z
- {0 U$ b1 \2 H% R! z" Y6 [1 Qfn main() {
4 E+ W6 m: d* ~& b
3 T1 ^. I+ m) y2 f$ A% |. I7 llet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
5 y% U( T7 K4 r' \
$ M8 M: K2 }* H+ _for row in &conn.query("SELECT * FROM user", &[]).unwrap();9 b- k, \; s+ f

% j* K- e" L8 Y2 f- k& @; hprintln!("Found person {}", row.get(0));
- S& G9 _4 o5 @4 `& H" d2 g, @* ]  h! {, d
}4 B! O" Q( b. H$ Y9 W

' Q1 }1 x+ d( @$ Q}
5 L+ F9 l- W$ e! S3 M7 S0 k& n" o: F  T/ p6 z4 L0 {+ D% d. V6 x
2.3 : Golang 查询数据* ?2 W. A0 k" H  U
5 D- E6 k& G' O8 X  }; h2 E. b
import (
7 H/ }) f) A- F6 J3 [. x. `9 L8 o4 k3 f! E* A6 V/ Q0 ~
"database/sql"
( j7 ^/ B( w" I: _% l. ^" X
1 C9 W0 L: m  l/ Y# S8 D& E"fmt"' C2 y$ J2 t" h# e6 w) G. E
, x+ a% I5 M/ j4 J: U& N
_ "github.com/lib/pq"7 |# x/ r5 w7 _; {4 ^2 ~" O8 M& S

. Q7 A" d+ p3 F" b. ]"time"
( X0 r1 m/ U- _- f; y: t/ \
7 c+ s. C" x8 z7 e9 H, ["log"! {1 r3 i/ d" H* S- j' p

; o1 {, G$ M) Y) M)
* Y2 Z5 ~, q/ z8 C; V$ r3 z( s) {# W" W$ s* @
type User struct {2 t7 V% q( h: P! z: w. k7 a7 @
% ^/ Q5 x$ A4 h. K  D$ m
UserName string0 ~% f+ \0 P" J- N: Y5 j! w0 s
+ s4 _0 o/ T0 |. K' _
}
3 K5 w  ^% D2 i' e
7 D4 m/ F* f6 g: O1 R& tfunc main() {
4 P& P2 F' j7 Z- I( |0 y; V3 I
4 p( {! c% m8 V1 _- e: i, |db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
) \  _- U1 q  b  A' v, h* u" F/ N0 N( M3 n7 l& h$ X
if err != nil {! [& O4 I1 x, f: J& `+ \& N
' G7 E; p  a3 j) G1 e( `1 L
log.Fatal(err)7 _. R0 K4 Y+ r0 u4 [. L6 V' P# }* ^/ u

; i* h) @) i' j! v$ ]return nil; b- j  o7 a3 J5 A+ z

4 S8 t1 |. Y4 T: K/ A$ @0 \' a}
" j7 e. s1 t  `  f; S- o% W) \/ A* ^2 ]; h0 o  E4 {
user := User{}
& O; K; f# B" |5 e
/ ]% r" K) T* \2 b4 \. mstmt := db.Query("SELECT * FROM user")9 q* w5 h3 i& L+ ^6 G. q: S, \) O

0 \. z  H$ W- t" w: ?) {6 q! `for rows.Next() {$ F- Q6 J8 F9 C0 }6 a  L
9 V6 I9 b. q8 x$ S2 h7 m& Q
rows.Scan(&user.UserName)
- z$ b% }6 X$ M7 ?. Y
, M0 d  o1 N% {  {, G# j* sfmt.Println(user.UserName)0 m; H+ U3 [" w" q6 ~9 c8 o2 Z& @) K% E
, b3 M+ v% K% l: t- G
}: @  U8 C; l6 R
% ^8 T0 P, |$ f8 x! I1 q
stmt.Close()9 |4 D5 T( R8 t+ Q9 a' f
3 B0 G5 B3 P+ j* q0 p' m0 ~
}
6 s! F4 ]' \4 O! W7 W/ ^" E" f$ Q$ S  D+ ?4 C! l
三、总结5 o( }% m3 f7 U$ {6 `+ ^

* @3 u# h3 r* ]; y- [对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
" k" l, N. X# ]: z" k' I
0 L7 e) s' v7 g这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
' \6 d1 y# T; R8 N3 \2 z. E5 I/ U1 h# O' k1 h& m
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
: B; S9 e8 l' h' e% q+ P( q; [4 U2 L  W/ O" u1 t+ a
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
0 X$ C$ g" |* t————————————————
" j+ j7 u/ N7 Y1 h" M版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。5 a! ?* N% h- |
原文链接:https://blog.csdn.net/weixin_30713705/article/details/1136339613 W+ c4 d, W  U1 n8 N3 Y

3 O; e; d3 W) K5 M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 10:21 , Processed in 0.140638 second(s), 19 queries .

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