cncml手绘网

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

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

9 a! ]6 k) b, x$ M$ Y% T一、数据插入 - INSERT: W7 m. y2 ^+ ]# ?) d5 e

& S8 _0 c: v) e& T  ?# g2 W! ?1.1 : DLang 插入数据
2 O8 p8 A; `& @- }( t9 @5 F0 Y6 }0 Z! O" R( I2 x; X( w3 X) ^1 T
import std.stdio;# {5 _5 z. e! s" [; E( v; v

9 M9 v: T, V) s( limport hunt.database;- S: N# E1 e' d7 o- O* v
" J: Z) U9 A  d: J% b9 T" X7 i" h
void main()" \4 @1 `7 O. J# ]/ T) M
0 }. ~7 ~& V+ m" D+ M
{( U! `# i( d+ j6 I# [* Z+ K
5 G# O- p- F: q3 t" J
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
# l3 B9 f  o, P5 c2 d% g5 p8 O' z, h+ b. a! l  W" z
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
& q0 M8 ]6 {+ D% P3 {+ m
5 D+ G! l/ ]8 A1 A// 打印插入数量( X- M# _/ v0 c5 U! ^# J# m
& a5 K4 Z5 Q. e6 U. P3 Q, ?% m" ?) O
writeln(result);) A( s! x  E0 V6 y0 J
* s2 g$ I$ E: ?  U$ W
db.close();
/ q, A9 I4 K& M0 K- z' |7 b6 v
  R" C1 w1 x4 O+ g5 p}
1 U- }+ Z/ z2 u4 S1 M9 [% q9 u+ n6 p$ P! d" |2 s' b6 `1 s/ y' u
1.2 : Rust 插入数据
9 ^" r! `3 f5 a' _2 ?  o! |9 X" ]# o! P- \, {  {
extern crate postgres;9 T6 J- h) }; u* V; i* |

! J- n3 r& J5 G, r9 puse postgres::{Connection, SslMode};
9 x" a- U  J" e4 d4 w/ s3 b0 A% a0 x7 x! T) U2 o( d5 x) y
fn main() {
' U+ \1 G, i' L% L! x6 Y8 ~9 b& f# z* L# [0 t0 b& }! U$ k4 q
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
& x' {  s6 W) b0 |* |) C
4 ^) ~) F! x; ]/ M5 e1 {# Q9 V% J) mconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();6 z! Z( \+ s, O& X! s

: @4 s0 t; u6 K6 R- W}
5 c' J2 J5 r- g% g" |4 @
1 T+ q7 R  K; o  C6 j1.3 : Golang 插入数据
1 k/ F0 L+ s+ ^( c& g6 K- U1 g5 d, G$ n: j- O4 j
import (
0 X( c8 v9 ?, L8 f& B4 D5 z
5 a/ ]1 s4 ^& `2 ]/ w4 ?1 E( S"database/sql"" O3 X" @% v" l+ I
: R6 D, d/ {* S/ z3 W
"fmt"
# F7 c5 C- k+ O9 I9 |9 W
% b: m" C( X- Q2 G; A_ "github.com/lib/pq"
; h1 ]7 s) f" c! Q1 `$ o1 g; f7 P9 Z( s+ X* c) ?2 j
"time"+ B  B# i, W: U1 H' h7 Q$ Q5 M  r

; s: Z9 ]. C- r"log"/ h  p9 j+ M/ q) r
# t$ r/ R: b2 q& [9 o. O% ]
)
( X! P, j" _8 q* j% G
& l. m& k7 v' y/ C; o* _9 o8 Xfunc main() {
1 |% ~& c$ B  G* q; ~3 F9 L" i3 X/ H6 e% a
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")# c, z/ p" v7 i) f
: V- r0 {6 B, }
if err != nil {$ l& b3 _& {8 Z8 t) t
1 x- q9 s8 ~9 B4 K' M& s# t
log.Fatal(err)5 o$ {) i: C( A$ u  ^

0 V, L: V$ X: B7 ereturn nil# S5 J1 }" p5 N

$ Y8 h. w- u5 F! @}
$ H* s( `7 r, I$ t; M0 {2 \3 U: M( Y) w6 ?6 z, H/ ]! v6 w  L" r
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
2 w& D7 Q: e( ~' L( e. L0 P: A6 u3 p. y9 T- n& J- A
stmt.Exec()/ k3 C( r0 r7 J# L# o( u; T6 R
' D+ d+ R- b9 p' {: ^) J
stmt.Close()
2 v$ c$ j  y* h: m  I1 `- I( j( I" d0 B: F+ V
}
! }; B! {) L0 C# ?7 ^( f4 V" E0 h5 x  {2 r9 q
二、数据查询 - SELECT
/ H' S" H" X( n; l  S  z
8 Q0 E) u5 E% q  T2.1 : DLang 查询数据# L6 o* D% d' M# K* h( Z: G9 R& M
8 @& ?8 z) K/ ]7 w
import std.stdio;
8 E$ H, A% Z0 [: m" |2 h% Y$ ]- T2 _3 y& L, m
import hunt.database;, P: c$ `9 E5 N% E: _5 v' q, f

! d# F# s( d9 J  |: L3 z5 {void main()# h6 D1 H# Y8 e, Y4 {

+ d$ a! Z' P* x3 f1 N) G{
( K5 R) E( V4 X! h) j$ ~, M3 E: x  D) q% T# z1 a- O
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
& O2 \* @/ y3 F4 ]+ k  p3 {# l; t% w5 l
foreach(row; db.query("SELECT * FROM user LIMIT 10"))8 a  N9 M& {: p7 T7 Y" K( ~+ I

" D/ s8 j- a; @7 E9 G2 u{0 T- F2 G# v* V" }0 W# C7 W/ A. I

  ?. O/ a) V1 u8 ^$ vwriteln(row["username"]);2 w  W$ ]6 t- i1 k! q

. {. k7 d: O# l( j7 [}
% U. ^* o3 J) ~6 Z) w! a2 b
1 ?, u( l0 F- Y& Ddb.close();
- q; e7 k% Z3 p" S. E# F8 t
. @; Q6 v+ l9 H6 [: ]7 _% j}
6 p4 {, [  @: _$ {9 [- o2 ~/ H+ T0 P3 w) r9 _& Z7 S( E, n* y$ r
2.2 : Rust 查询数据- s( F- j4 ^4 o/ `: j

9 e7 c. R0 a) y# Wextern crate postgres;! n5 R5 n; [6 l' ]* ]0 y

& Q; O( X% j6 u& r$ Uuse postgres::{Connection, SslMode};
( t- R" r) a: B) G3 ?- d+ k" E
7 z% U3 q! N0 e" W7 ^6 a/ cfn main() {
4 T2 n6 K( X' w4 @9 ]) N' A# D" m0 W7 R: n# [
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 \7 x1 r, \- b+ L' V- |! n. r* P0 h; ]7 Q% a1 L) Y9 y5 q; A8 e) ^) r
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
/ l1 x* J& u: w# e" ]' X3 j, x! _; V1 S6 p" ^) L# C
println!("Found person {}", row.get(0));  W& {9 x( C: T% K
  U4 J: H6 |8 x3 p; ~+ G
}4 `% a7 i, ]" C0 e& R# ]) x0 T

8 _4 i# w  K" W: s3 M' b$ }: U$ X. G}9 }5 ^( u- {7 j2 d3 Y0 o& Y2 t

+ w9 T8 V( T! Q# y2 M/ k! F2.3 : Golang 查询数据: \! R+ K' v0 p& B! X1 n

5 M9 P  q9 ]" z% f* I) ~import (
; m4 R, K. x/ [6 D$ ?; M: P. e* _
$ J/ |' y7 D  {- c# V' v/ y"database/sql"
( Y5 D- q6 a8 w2 r
, \% U& B( f( G"fmt"
- t$ @0 v3 p2 I# e. c* h. P# f. e0 O
1 Q& B' [% \& O' @+ _/ V. `& b_ "github.com/lib/pq"
$ y+ N9 o; `0 U1 R* |1 ?- p7 O) F( u6 C  v2 |  j9 o
"time") W8 b( |% ?9 R  t# R3 Q7 ?

, g. }% r8 S9 [. b"log"! w" j! ~7 X' S1 Q0 Z# A
: r9 R2 ]7 a% n5 O  u
)3 b  K$ k' ~, Z$ D
9 o5 i. {0 y2 K/ X
type User struct {
' `# D% P- |# A6 U& f  H% n" _  `0 S3 Y* \
UserName string* z) o: L5 Z0 B

, O! J) b. \) Y, J' t* R" G2 v}& P% d7 Q  `. l

6 K8 k4 l& ^5 R4 ^func main() {
& ^3 d- F3 B; |3 s/ {+ ~
* y  U- Z  k+ h0 m( o5 _. ]% x( ?" [5 ]db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
/ @; T$ U) ^! e/ m, m0 s3 W  T- W- O1 z8 E
if err != nil {- _! F2 ^) p9 [- O6 n" v: I: _
2 ?" k0 X1 @: |
log.Fatal(err)
. f1 A! B2 L$ g2 }) B2 ~, R# l8 t) H% ~" @$ i. [4 _( L1 W
return nil' e! _8 z* b* S" x* G8 x
5 o, t! i' x" A  T) O8 X9 D
}
9 @9 S6 Y4 Y0 f* k$ l: P- F1 v- K2 ]/ F6 c6 v/ Y
user := User{}0 _) l' x9 m" ?9 A4 S5 G
3 b9 X1 L$ ^7 U! R+ `6 J
stmt := db.Query("SELECT * FROM user")
6 |' U1 ?5 \4 u! G( \9 z* j4 P- J6 C7 J) S1 S, E: Z
for rows.Next() {( U3 v; X/ W5 d4 w4 ^. f! G

' p( g% g# F. f: r! H( Q9 yrows.Scan(&user.UserName)
0 u7 L8 M- y; |6 T3 o) Q- k, f0 k8 P, [  W8 K
fmt.Println(user.UserName)
' g4 j* i" _! r
! ^* x3 M. \; j}/ J* W( i0 ^  A: a4 q7 C

4 r+ z, Q( E4 l/ v% Qstmt.Close()
7 E/ A, y# l8 c4 ^5 B7 K# ?
3 r$ d( S( h9 ^) q$ g/ I}' ?* ?  t8 D$ d# f

' P. p# t6 C" e9 o/ ]* v4 r# R三、总结  t5 R0 K" x5 H9 z
& A8 q% Z8 r0 I) n( ~2 A9 f" j
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。* t/ V4 C3 x' ~- Y1 H' b3 V
$ Z2 u; a& M# g( C2 I  ]# A+ k
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)# L: V6 k* j) S% s4 c- |
5 I& h* ~# E+ [& k* Z
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。( T* R+ ~: p& d9 w9 `
+ X1 L4 i' w0 h% N- Q" q" r6 G
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
( Q/ c" w/ S) t  K4 @& I9 g————————————————) Q# i6 @' m! E1 N
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 h/ p8 `8 b' b原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
% w5 |- V3 v4 b. m( H8 b  I0 v# h5 H
8 p( ^; @$ T! C6 l0 G




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