cncml手绘网

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

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

: E; _# q7 [  z& k一、数据插入 - INSERT8 V* d5 X4 ^; Z6 l1 d

" ?5 K+ d# O% r/ U! a0 G/ @1 A) P1.1 : DLang 插入数据
; s9 q, C0 F- U% {4 H% z; |: _2 y
import std.stdio;
, u2 B* P1 o! g* A
! x: D; s; |# b" I& Cimport hunt.database;
6 Q1 @0 {; }5 r) _: M+ L' ~
5 T1 R; y8 j% P1 j9 q# I. Cvoid main()$ U/ c5 {' \# w

* V4 e. ?3 T+ J: d& \  f{# M( M  C. n* i3 {* f* S0 e
2 P; {2 K1 V# y9 K) }1 V% b
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
: f4 x" s! D9 a6 t4 s* a! H- D+ n8 M4 {- b1 r
int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
& t9 q/ X* b7 q) N. @- \& H1 k7 z- W+ D9 t
// 打印插入数量
" Z0 m# V: u, o. V! w5 ^* @) ]7 _
" ~) @! ^+ C- O  o( Qwriteln(result);
( E/ @8 E6 }. M, ~( I+ `$ L; F
4 a- M: U) F9 o+ O  Ldb.close();( {! u( F" C- D/ n/ o

* c  ]# k! U9 D! K}: E' @: m- ~7 r7 q4 V
8 r) Y8 C  F) f; Y  F+ c" J0 R
1.2 : Rust 插入数据
2 @9 K" r- {/ A8 B% v8 s- S+ h
( V, x% R+ p. s% I: ]extern crate postgres;
8 E- t/ q/ m$ a' O" v; Q
% C7 M9 e; Y4 L# cuse postgres::{Connection, SslMode};; M/ v# p. \5 d
$ u* I7 b. T% |' @7 _* m
fn main() {# y- \) X. {1 N" G  k: ]/ |
2 ~1 W4 P: z7 f! C. d" Y
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();* N% Z; ?( Q$ r$ k  U; ]

! p) _  f  S. }) u, Wconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
) G5 g( o- x- _4 o2 N& d+ m4 b% S( L" ~1 ?
}& a; p1 q( s+ c
7 M+ K. T1 ~4 c  x( W
1.3 : Golang 插入数据
! D, v, J8 h8 A( b' R  P, e  ~! `; s: F& |
import (
: l6 U+ C* x& o: j; Y3 {0 b2 w/ G: d' J1 J3 D8 Z7 M: `: R
"database/sql"
+ e9 j  W1 K# Q7 }" t- c/ w) {8 m, m2 G
, O$ a. Y' @% f  n1 O- _6 _2 l  \"fmt"
. a/ k5 l# W0 M# M7 A/ n- s! q, V
- n$ r) s$ d8 m& ~4 l# N4 n_ "github.com/lib/pq"* B3 w2 t: t* N

4 {* S4 O6 Q& }* n. r* U"time"6 Z8 C5 F1 a% y- @# H
6 z) J0 q6 D" T' Y
"log"7 E. z$ e1 G9 Y" r+ \% [3 j
/ H$ A" ~+ Q: Y" U2 l# g
)
3 \$ Q5 v' T0 `' ?7 C, x: h6 \) v2 ]( G4 z
func main() {
6 l6 `9 O; h2 S: P. @2 B
' v. R8 A% ?4 T6 B/ P; _( {2 Pdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable"), T1 b* J8 a  F& L5 C6 O

6 g1 [9 K9 g6 @9 E) H& oif err != nil {' U! ]* }! O* z* s' ?0 M" V

( F' z& q" d, E! alog.Fatal(err)' I$ z9 F) Z, ~$ ?- |
9 a1 o8 R* W! T3 s  `. h
return nil% }& a9 f# |; x& H9 B; r. J

; S5 }1 ?4 V* E: W# i* @9 {) O9 @" e}
8 k; F" u8 s) w, W9 c) [4 R7 A! h& ^/ S
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
" w4 o: ^) \2 J8 x, j8 [$ f' ]5 o- G8 h* Y1 Q6 q' y4 V
stmt.Exec()
% F$ T. |4 I- C( d9 b+ y' J! n
  y- F. e  b( Fstmt.Close()
1 m' ~5 X/ c3 K, W. M
% C4 u7 I# }! h}
' [& N% |0 ]! y3 o/ M! j+ s
+ Z  I- R' U, t! w# P+ j6 l二、数据查询 - SELECT
+ {7 t$ Y2 n' G6 k6 d  `
, K" {' a9 d& ^' D" c2.1 : DLang 查询数据
7 p) S3 Z$ _" N0 R3 {, `- g" V; y% v
import std.stdio;6 R9 i/ E& B* k, h) k
, q1 ]  O8 b9 x% P* P% T2 l" j; n
import hunt.database;
2 X  R6 }; m% H" c/ J: r
7 `/ S# m. L7 ^7 T. Svoid main()  ~+ \9 g9 I5 M. U$ A# @

3 H! G' i& W& C3 R+ Z4 ]" D{. |3 {+ L$ v7 P) {! A* R
) y% o; N8 H  L% Z; {( q- U
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
  Q/ i; ^3 Z( {3 S. x  S; W/ n4 w" C: I
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
2 E9 R  `2 m& ], {
( u! `5 B: Q/ l, I2 n9 e{/ z+ d, |' z, o4 o( U3 C

" f0 t# G- p' y' Jwriteln(row["username"]);
: C3 B6 p$ Q# m) X* N  U5 B7 s
  {- g+ {: i5 e5 i7 W}9 _  M5 g) F+ K9 D, O1 h4 R1 F

1 |+ n+ \" \" Z$ |. t4 i( Qdb.close();
: c  t7 U" }2 P7 ^
  k* D9 b5 L# z}
& z5 w& j- B- {
5 H6 C6 v/ I0 _6 d( f0 _2.2 : Rust 查询数据
* e, a- w: s$ F& v
% d, R1 |" q+ d' hextern crate postgres;
2 I% V: g7 z5 g5 A5 w$ O7 r0 D3 H* f% |, y# T& v8 }3 v
use postgres::{Connection, SslMode};
+ E# D/ A$ J5 W& p! M; k
! {+ I9 P& I' v" t1 r: C0 e8 ~, _fn main() {
6 j4 Z+ B3 b+ r/ _" P  s/ Z
" N" t  p& P' S* C3 J! B0 Glet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();, O* I3 p% n! s! b% y" F8 i
/ e8 U0 M. d; p
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
: @, y0 F0 S3 a  J3 |+ e! x3 W% s& Z- ?* E  n2 Z
println!("Found person {}", row.get(0));
2 y! P! D8 D& ]# P: m: g/ t0 u+ |2 g0 ]% f
}
  g6 u+ \4 p) \' z* I5 P  J
3 ^2 C* [- S2 O) x}( t. R5 y) ^; S2 u1 E5 I
( p7 H! w( }" }- O. @1 @
2.3 : Golang 查询数据
/ t4 x, R4 |6 q% j! y% U: g6 [1 j/ J0 z. c( s
import (! N& j  |2 c# z& w  i

+ s  W1 L% _# e1 t/ ]7 |"database/sql"; e+ Q/ a4 o! R8 d2 M

* Q- m2 C# Z( u2 P0 k/ D# `: S"fmt"
* @) b1 e2 ?6 Q, c9 l! ?9 a" a) u& Z, p
_ "github.com/lib/pq"
6 X( A7 T! m; @: M( r7 w; q% j4 O3 K; r: {' i
"time"
3 l( H+ y) n% f6 R4 [9 |' i& e3 A! r
$ s+ }; ~  O/ G+ V$ I"log". c- o9 b3 |# b) r
" S% g5 R% w5 R7 s: p
)" t/ n* h3 k. R" S9 _3 l) S# r
* V9 P' h+ v0 f. e; f" h6 g: f* w
type User struct {
7 p6 f: {* C  H# m- f& v& N
9 [! h; q% ]2 y$ T9 M/ i4 hUserName string1 C; g! E6 p  |% `+ f0 [
& ^$ A$ I3 V1 R) k+ D
}$ ]8 w" }( E$ c* R# N
, u$ S1 W+ n( G3 J
func main() {
9 o5 d! h1 j5 l. D# j6 z8 y' Q2 d2 ^
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
9 ^6 o. h' M% l0 x6 Q; e+ l0 x* {  i- G9 k
if err != nil {1 M. c! Z. Z) W5 s8 [: ^: N8 F
2 m) z7 T) ]; V0 n, x
log.Fatal(err)8 }$ ^7 Q' O9 T; S6 u: A

$ r. p3 R6 {& G1 Mreturn nil; P/ T' Y5 r0 l

, U- }( s( Q! J9 O8 w: [}# u$ _! C9 ~- \! u) e$ r& Y1 Q
' Q9 O& J) z# a" }% |; q
user := User{}
4 m, h+ H( T& a/ h( n5 A. f( ^
$ ]  h' C" r6 M2 Hstmt := db.Query("SELECT * FROM user")
  }: }. _, u2 d
1 y0 i1 p- w' E2 q3 }for rows.Next() {
1 N6 E( s1 t1 M( @3 L0 V# d" p% N, U8 X, y5 h: ]' K( b! X9 S( `
rows.Scan(&user.UserName)& [! D) G3 O2 u$ W' p$ @- R8 T. |  u

5 \, E+ J  S1 K- V1 Ifmt.Println(user.UserName)
7 ?; k$ k( y2 ?* ]7 _0 r* ~  I% ]3 ~( `' X- ?8 S
}
+ E* d6 B8 H! S! M' N' Z
. d0 ~4 E, U8 u) Lstmt.Close()) x5 |0 C( S8 Q- l

# |1 e3 W- Q' o7 E}
/ k* I5 P4 v) R# W1 b+ m$ e* z' w& c0 D3 N8 t
三、总结1 z  j% v0 X' k- f5 ~/ n7 y) W
; N- m: g4 G+ h
对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
  ?3 E7 i: i2 j/ |( J+ {0 r5 {- M0 B
& ~/ Y5 @- Z3 k9 L9 ?" Y6 g这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)- S  r8 ?9 v0 {6 A5 g
5 ^  _/ C2 D% j7 t, b
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。# z4 l8 g! C. Q# K

9 F9 m2 m/ L( ~* R4 B% A! @总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
3 Y3 F, A) H$ C& l8 K1 M! p————————————————: [3 e* _) g' [$ T! z' ~7 W5 A! o8 I! l: V
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% d: F- ?" ~) V! a" o原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961& I' W( G& k! H
6 }6 L4 l6 p0 z  t  Y9 f9 s" J





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