cncml手绘网

标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式 [打印本页]

作者: admin    时间: 2022-10-26 00:48
标题: rust连接mysql数据库_DLang、Rust 以及 Golang 对比数据库操作方式
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。) L4 ~3 O$ Y* X% l" x- Z

9 {1 _$ \& V8 M) Z' x$ k一、数据插入 - INSERT
6 R0 X8 Q* z0 [
6 V' a! R5 K; Z6 E8 i) j% A8 B1.1 : DLang 插入数据4 r/ }/ F& V- M) Z
, W! L1 L% u6 ~  V) N6 v0 Z
import std.stdio;
1 F9 s. `( u+ t' A
& i/ b& U' P9 Bimport hunt.database;
% [" A+ V+ E! D6 u4 q- \
. O4 j! C; H1 e% c  v9 `void main()% t/ X: B7 q: ?& G6 c. ^4 b/ V

. k/ p+ r, G, l" ?  q; Q{& e! R5 @) k" V* s1 h

( {+ y/ W1 f& O' Xauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");+ D. ]: c# c# t& e% n' b

0 A2 n; F, }' d7 l* K, Cint result = db.execute(`INSERT INTO user(username) VALUES("test")`);: n: J2 i- j9 T' f. c! F8 z) R2 U

, [- G8 ^, E- ~$ R: @// 打印插入数量
+ s# m; ?6 r7 `8 r- [
! n$ z1 N6 M+ Z; ?3 @! \writeln(result);0 I. n/ \1 O1 {% I. E4 _: ~

# R( O2 g! H4 _1 a( `) g& }: F) k* cdb.close();
# T$ Z) C" Y, P0 D( E2 E4 p
0 h/ x/ ?, [9 G, v& U1 D) d0 T) |}. z* X8 s9 |/ s

) U$ T* V; M. n* L/ z; u1.2 : Rust 插入数据- b7 Y' a' [9 d& U# `
4 B/ {8 T" S, x# \& P1 e
extern crate postgres;
" U% k# x8 `+ X" N- o  b9 I: p" ]  D/ y- P- M
use postgres::{Connection, SslMode};
! M, \9 r! M5 B5 B9 G+ @/ g. }7 x/ T8 ^* d3 R' @1 c9 s* \
fn main() {
) q2 u& v) a5 _, ]6 d% p6 i" M. q1 ~% Y" D$ A9 L
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();$ b4 ], w+ d' C% q+ r7 o
- c: \, Y. t( ~* e8 x. s# R
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
2 \. d1 B' x; W% ^
  \8 x" S8 U0 K/ P9 y4 k( z) _}
+ C; n% O* S8 ]5 @* v' L: A6 Y
' P$ j  y% y8 \9 s. z1.3 : Golang 插入数据
' U+ o" G. \. z" B4 }; K: a2 @5 @6 Z' h# y7 Q9 u7 k& C
import (7 v( o9 p* [+ z4 U
$ n$ _9 |2 Q8 ~( ~; h6 R
"database/sql"
1 q. f9 _4 J/ S5 A2 `, m
: M( y0 ]: r/ T# I2 B% }7 b* H"fmt"
% c+ X4 |! \) e' C! h* u* F# P  u+ m! d  d5 _" g+ F/ `
_ "github.com/lib/pq"5 c+ P' G& k, {* J* {- Y$ q0 N' z

# A! W' r+ t: D" B& I( L  ~+ Y( _' ?4 Q"time"
2 `  e0 m# c: R: a
  f9 s; I$ Z! }3 U! j  a6 Q"log"
- p* n* J4 O' ^: `! Y: Q
) s# i" z+ Y0 u)1 {2 q* @' X% H
2 o5 v- ]: M8 [4 k& J
func main() {
+ E5 m4 ~7 p$ e" B
- Y% g5 X$ t. W" l* `2 a0 H7 jdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")' U7 S$ Q! u0 c- M  P
0 c9 r* I" p: c/ ~+ p
if err != nil {5 H0 i' K- G5 G3 Z8 `: {+ }9 M

/ m# P* n+ N% h, r! F0 B: Zlog.Fatal(err)
8 d3 \* r- a: u
: s* O. y8 Z# [) nreturn nil+ k( ^3 O- u6 S! ]1 @, x0 H4 s' x; |
  ]( h; f- q3 X1 V3 [
}" [- G: b4 n; w

' N! J' C1 v9 W7 F! n% W7 p9 wstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")4 B9 g' _4 D* z# R# g% [
) E( H/ b8 s' u; q8 `+ W
stmt.Exec()( i! N% [" i: ?5 |; N8 W

4 E8 \7 `( |/ y% n" t4 Sstmt.Close()% g" B' e6 [' Q: _8 r' r0 ]! W8 v! j

" C0 m! X! w$ ~* l5 |& T}
& m. F- y6 q) D  E, I" @/ E/ ?, r# D! x/ c7 g) O
二、数据查询 - SELECT0 o6 X7 u; j* p! V) f# h, y

2 B8 F( P, W3 |& ]3 U2.1 : DLang 查询数据
" p6 }, x$ d, u
* R# x" V, s) j7 }/ c! Qimport std.stdio;, L4 Y5 s9 p( u3 y( E
. d" W( ?% ~8 x
import hunt.database;
4 [6 S  O) D( c/ T" M; D
/ j& k: m& [5 V( |' q8 uvoid main()  o1 c# W( s5 s1 D6 E* K

2 s% A% c; P" j+ w6 h  |. Q5 `{
& v5 `: y! j! G( s4 ?' n2 F* G5 p1 F1 f* t0 B
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
: J' U8 j3 a6 R
/ [- K' N! \- a/ A3 Q$ s& Cforeach(row; db.query("SELECT * FROM user LIMIT 10"))9 y: s" m. Q, J4 O2 }1 f* R
" v7 h$ x# f% z2 j  b
{; y8 e0 M2 t. B# s' C3 u
8 o8 E% a4 ]0 k! I2 o
writeln(row["username"]);
1 V6 ^. ~8 @" J4 n( D
2 t( o1 g4 m' @& b! C' e}3 ^0 p/ L8 X9 A5 w/ g; _( m! c, n- O
3 p8 I7 _+ K. A1 `7 O! D) o
db.close();9 b1 g1 x& B) K6 i
4 P" d# M; D1 X( M5 I' P6 p4 M
}
2 O) O2 C! o2 y, M6 f3 F! G6 @) L. _- O; M* j7 {. [
2.2 : Rust 查询数据
, h% m% x% L- K+ x
6 x3 F7 x" r. C! rextern crate postgres;
0 ~1 S6 v1 M& e! L" S' ^
8 b2 c4 ?/ v% ]$ n+ d- ?9 U4 ?use postgres::{Connection, SslMode};0 h$ f! L; ]# O- z) x$ u8 i

$ O. {! L$ }: q& E& C' Sfn main() {
" r5 G+ |+ \. T' _: m2 O
% v2 [4 R: @% O& k1 F4 Glet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
7 j8 F6 g% {4 V2 L9 s0 i2 r( ]% t7 }- g/ T. y
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
2 Y; `7 O8 f6 y
" M- K. h- S2 Xprintln!("Found person {}", row.get(0));9 Z3 x8 j5 R8 e0 Z: M) f9 p
% ^0 i8 C! B7 C) d' s
}
6 e7 Y% }9 v6 ]) k5 O! i* L0 f; [$ l: I. _1 M/ w
}+ P1 M9 h; a3 P/ F
- s0 D& i* {5 m6 p4 ?6 K$ u
2.3 : Golang 查询数据
3 p# S' u& n9 w3 X* J+ ~  v5 m2 D/ i: a% n) U
import (2 k$ h. K; |% J5 {+ @

5 w+ ?9 ^  A9 @"database/sql"
) |, {! S- N4 D4 {" F
+ x2 R4 o( k' y- Z4 X"fmt"
0 D1 N+ \" n, I/ x. s) A% \6 _: l+ c" F0 C) k
_ "github.com/lib/pq"
, B4 T- I) ~" O7 i: c
0 o1 g8 A& P% z3 i"time"
+ [! e, i. c9 g6 [1 M: p/ L
  U5 R) G6 B: K! k4 |/ }( a"log"
, E1 h8 t: a# {) f) Z% Z8 Q
! f7 ?$ c5 d$ V6 Q( S; ]6 O6 A). O* G1 ]8 V5 ?) Z: o* T

* A8 _" |% L9 ]; ?0 Atype User struct {! x" O2 v0 Y( w0 T9 O# P. Q

( L& i" w' U% `# \- R: q5 e% a3 FUserName string9 S4 ]; ^+ Q4 U3 \3 N4 R* W
9 v9 ~! k8 w( U+ C
}
9 a  L& P+ k6 e* s  ~4 F) Z9 p0 v2 X3 {6 E
func main() {6 E: V- H+ \( G9 n
# k1 r2 y5 [! l8 ]
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
4 s! p0 X2 z/ k' l% o. V0 }, a; s- e( v# K
if err != nil {2 K# Q. O$ ~6 v% d

3 _+ X1 j0 l8 e3 L# clog.Fatal(err)% A3 c; V- v5 Q2 [! k$ `* x1 N

( a/ T# T) B5 \5 B# |" F3 t) |9 oreturn nil
% h( M1 B5 H* ~- s! y- Z9 @
. o  T: W" l) V* C; F+ c" ]}
- R, @& s: z, c: \9 j: e: J9 L+ f, ^/ L2 @. B+ \6 N' L" ^. ]
user := User{}' Z) H5 X1 s1 \0 B  V3 {. S

( a9 `7 W6 h. E6 D1 p2 Y+ s" istmt := db.Query("SELECT * FROM user")
7 R& f7 N: p, g' `# I1 o5 y0 n( C
% L- l, A, \- N. o. x3 b* B6 `for rows.Next() {
5 C8 p" s' S; W6 U
! w- S' i/ Q! X- s2 Z( d7 ]. f2 }rows.Scan(&user.UserName)# u! z3 P$ d  a: p4 E0 N  {

( X' `( O, c) J: b* H) bfmt.Println(user.UserName)
  y8 {: `# S  v7 s2 K9 K  y
1 s. e: P5 I; Z) @, m1 y9 b5 e}1 f5 q2 Z" b1 B4 ]9 C% T

+ K7 `3 e/ x' D0 Estmt.Close()( N5 C, C5 ~$ V
7 b/ ~9 d  H' c, J+ O
}( V, m9 m9 E* o' ^2 n
6 l! Z# `, p6 y( z
三、总结
5 q; ]% x/ Y# e+ Y! `3 [7 F; p
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。; |3 a: n( \" \, G

8 b6 H3 ~* E& O+ c7 h2 ^这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)2 Y% p$ E+ X6 Q. g
" a$ @0 `) x& V; N; T; a, }( H
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
0 y, q* w$ o' a6 l5 {; ^8 x% W
4 o" g6 c+ y* I8 v1 Q2 m/ N总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
, x7 k% P/ P1 _' L1 [————————————————
  c) u0 B4 o; t1 f; D0 A& b版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& c. E% R% Y. b: t  u5 @原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
* N& _1 j" R0 Y- C1 S& i, a+ g" ], [: w- k





欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2