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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

9 j1 F1 S/ \8 W  B. I9 N, u一、数据插入 - INSERT
0 i& O) e  E2 E/ U/ p+ n! E. M. ]9 c3 n( D8 y. ^, {
1.1 : DLang 插入数据) j6 m7 t+ `2 U* @$ B4 p) |
, g% P0 f9 n, z9 l
import std.stdio;; t+ M" N+ }) u- `+ ~7 e7 @9 ]

1 D# P: x6 t/ I$ w: T8 Y; M0 Ximport hunt.database;
; H$ `" v  l( T( [( b) V
7 c3 U5 U# a# a+ Z  Ovoid main()# D$ z2 U  A2 I  A

* B8 o5 F0 X, q4 {8 b$ C- ]{
  q5 d  @# G  d0 h9 Q  M
2 I3 d! `  M  |; h, Xauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");; B) ?  _4 G0 H0 H

; S6 \5 I- w# `% oint result = db.execute(`INSERT INTO user(username) VALUES("test")`);8 x" T4 i, |) O7 a4 T+ c. j/ x
5 H9 Y' P8 f, E  [
// 打印插入数量* d% _. n6 K) |: q4 Q

9 i6 D- E) J- g* c* p# ^writeln(result);1 N6 U% c/ w) l

( }) d* x' ~$ c, o' O) ddb.close();6 k( v" {; \% ^0 j$ W+ C7 q

7 H! Y( F! p( L, ?" p7 \( f6 u}
& W. F7 s6 K. D! ^9 k1 m0 ~  m) ?) \) Y) F; Q
1.2 : Rust 插入数据
5 n9 r) ^) Z! Z) S; A1 C  T6 e+ K
extern crate postgres;6 T7 k# n5 ^9 x
$ E$ I$ z+ S2 ^0 ]9 \" j
use postgres::{Connection, SslMode};
4 l; b6 t! d9 v9 T5 Y0 D+ n" y6 ~8 }) q5 c" c
fn main() {
! Q# F/ k8 n& \$ l4 c! u) ^0 r% R! N6 A" x1 @# B; p( x* O
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
, \$ t( q. V# e) `3 v0 j+ _& A
) c" J4 l5 Z  Y5 P8 |; ?* i* t: @5 j' Jconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
  S0 @  k# P, ?2 {6 P* u: n% K" C0 Z# a  ^% j/ E/ l8 n* [/ `$ A1 {
}7 l. Z' q. z, m2 h* k; g( F9 `

; t/ M) _  I0 Z2 V, G1.3 : Golang 插入数据
4 h4 y2 a' I/ W5 U  E, \) S% B4 o+ o# [; k- G9 _* n2 L$ M! d
import (" t3 a) T( @% g% p1 r7 t" E
1 l: p2 I2 K7 \9 U2 d
"database/sql"
, B( r# p0 J7 U& \. v" [& c1 h0 e
2 s0 a  K$ A# H2 o0 L"fmt"
6 i4 j8 a& S: V: i6 F
& r/ U5 y3 e0 c+ s/ e- F! I4 g% v_ "github.com/lib/pq"
2 g, M7 l/ ^3 i' v' |8 C
+ j8 C; y/ L' T$ I. ]/ b/ x: r- E"time": o$ B4 e+ P1 l6 k6 P8 ]/ y7 g, ]9 |
# A  x4 j* w+ w7 s' j9 F2 T
"log"
) |& M2 A% _1 b- p6 Z" R5 s! Y6 K* v; ^7 {
)
( v  m( Q3 W: K3 ?3 E% L5 B
% I* {% I6 I' w1 J, Nfunc main() {
  s4 ~( R6 @( w# j5 [  K
- F% C" J* a. g5 D6 O7 vdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
9 S2 P4 x  @0 a+ O' _% w- W# r4 J2 [# Y) s% W" q
if err != nil {
9 ^. ^" g9 L! \& A# x: J6 O" p) M
& Q+ w/ f1 Z+ _. ?6 V2 Z$ Xlog.Fatal(err)9 P; Z) y4 W8 N0 H& v' _9 j# Y

: A# }; [; a) N) U+ vreturn nil
' R0 q8 T* U, n  o/ _" A. v- F; e8 I- |$ I2 s5 x. d
}- G5 }" p6 h% \
" l# w6 P! p% L$ `7 {  s1 g" g5 i$ ~
stmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")7 S  {% H9 {( a$ ]' u: {0 S( M

! z" p, }. U# k" [stmt.Exec()
% P1 M+ J- i' T) [( \$ L- l$ g
stmt.Close()0 m, p1 S* J2 K0 a8 e% h# \
; i8 V6 ~; Z7 s& L8 u0 A$ |- ^. r
}& L. U' K( o  Z
9 m( i: A# N) D# l
二、数据查询 - SELECT: j6 C- w# U' m4 y% T' v
' {3 c7 `4 H  I: z
2.1 : DLang 查询数据+ }0 [( }1 p! ]( X( g: T
" x, }2 j7 q! e" N. l
import std.stdio;
6 T0 a( {' i1 H* U+ Q% D
9 W4 U& d4 e0 b; Bimport hunt.database;
/ `( Z0 ^3 v0 A' T0 f9 n$ l9 {7 @% ?6 E) I4 \( x( M
void main()
3 M. Z& U6 Q- Q+ q: J* Q& n
6 y; T; d& F( V. J{
' V7 T; O# U/ n( `/ @7 q$ `
, ~& \( a8 G  O( B% Yauto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
* w6 Q( H$ d) F# K1 A
3 J# Z! n$ A8 A, G/ zforeach(row; db.query("SELECT * FROM user LIMIT 10")). A) h- s1 l; Y; |! L3 U+ t
6 X, R! \. q7 K; k
{
" Q4 [: {3 u& }5 }$ I) Z! ^4 `: y$ g. b& ~5 o4 w" ^' a8 ~
writeln(row["username"]);
% e7 M; o1 g  H& v" \8 Q8 W4 B
8 B1 q- D6 @9 C6 X; n& n}: @) }5 S' {- Q, {$ t8 L2 M' X
. b& ?- [2 n+ l4 f9 [
db.close();
' G- H4 D+ K+ \. W9 Z# t% H
+ T. b4 O9 I" Z4 M/ f1 M" [& D$ M}
  t/ A% V) {/ s" X+ |$ m  _' c/ v; C7 Y  o( {2 y5 t% z0 ~
2.2 : Rust 查询数据8 G, ?- n/ w8 T/ L+ O$ a

4 U9 h/ G0 [  f& y' L3 cextern crate postgres;
% b: n: K7 S$ F0 ]8 K" @9 T; X9 q- h
use postgres::{Connection, SslMode};: Q( i8 d% ]2 j* o

3 L4 b( d6 @* B3 |fn main() {# d# t. A7 |/ u# U

6 K$ P( u+ G5 f+ ~, ?; clet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();* ]2 H- f! q7 y. w$ G6 w
' k3 e1 H6 n+ S+ x
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
& @2 l( v9 y' y0 K3 g% V+ d/ ^
2 q- \+ `/ s5 x) w( w( `println!("Found person {}", row.get(0));
& P' M: ]! p- D* ~' k9 N
3 G" }2 J8 c+ E" M$ C( r; D}
+ t. g$ D7 D* u% z. q/ O% T
( m% L2 Q; K5 j3 I  `5 t}, f" I- Q( {9 `1 t0 _. ^
) h4 \. c+ g. ?' O
2.3 : Golang 查询数据
2 G- ~, x- z1 z  n; p& O: |1 l7 L0 C* I/ p
import (; ]  |* j- m' G

$ F4 F0 v3 n) S* [6 k* \/ Z"database/sql"
) L8 B  ^, R) g# e7 K2 q2 m+ S8 c7 q0 U1 y) j' x
"fmt"
  C- m9 o8 R& _8 Z7 ?6 W& B6 j
2 S: R5 X9 b) y+ b: N) u_ "github.com/lib/pq"8 r- O7 F8 g! E$ t9 L3 r# K  T! \
- y: b3 K1 Q  F
"time"
5 @% m+ l% [. i4 e& G4 g4 K2 T' j% ~' w* d5 ?* E* j4 }" U
"log": ^: b0 L$ z9 B; D4 w1 s; {% A
" l' B' J+ v% B9 T
)& I& t0 A3 C1 S" Z, f
3 b4 c/ e! b: T; F+ f
type User struct {- [8 q4 {% `3 m. v
4 ?2 I$ @* C3 R5 Z' {# t
UserName string, z9 g/ t: F/ Y: m/ w

8 @6 }6 D! w- Q: J9 d}
1 o* b5 ]3 S$ [* p# n' g* ]: @2 v9 e9 m9 O0 Y+ ]; A
func main() {  E& z% l+ |8 i+ H

4 f- z9 q0 i5 ^. F& K. V0 Hdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
$ z/ G0 x; ]0 ~$ {8 [  S* ~) ?. M, }7 {
if err != nil {) \3 W; B# `  K: U; H' _. K

7 Q+ h" ?, b+ \( Klog.Fatal(err)0 Z: M- p4 V) m

2 `1 X$ ?" A+ c) ^return nil
! o& g- j7 m* Q# {. }6 V* d6 M* }1 C  |1 B& {' {* |6 s
}- C% n. A. ^7 t7 ]2 C; a' a1 J

% G" Y* }5 o  T* k+ ~& E; p( auser := User{}6 q2 v6 M! s$ k$ K3 V9 [! I

' ~, n  r% |5 y! a( `stmt := db.Query("SELECT * FROM user")2 D2 G6 b! G6 i

( r9 {/ \: `, L2 \" l+ M7 Nfor rows.Next() {# H& W/ g8 J' E# D/ Z1 g) ^7 y

9 a, r) L) z2 E4 `rows.Scan(&user.UserName)
2 h' [- f4 W+ |3 c; l- K! G) K- b4 T# K5 H+ U, s/ R
fmt.Println(user.UserName)
4 v$ `; t( O  ^  S* ]% e& m
0 A; ^1 Q7 d! X) [}4 U* l% o, C7 F, b' u3 H

/ T( o0 G1 u+ V# _; K* R# ~stmt.Close()- @- x+ ~% B% R0 G  E! O" c
% J$ Y1 p3 ~4 L0 j
}- x% b: ^8 L/ B% D9 H7 M0 z
/ q$ n% {6 j: D
三、总结* Q9 b  R$ D9 P' P) [; d* g5 l

) l( Q( k# b3 `对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
% R$ ~: F& ?* \- A& S9 Z! e( D
9 e+ u2 E" F& D' M这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)/ V' X7 C$ X1 ^) ~0 b
- @6 P7 `" A3 V/ o) f; R
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
' ~& m# a! x7 Z
# j5 \& {4 v1 f: b) o9 T5 v总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。" {, b& T  b" F7 |/ l$ k$ t7 B8 ]0 d
————————————————
% d$ P) J. n0 j+ a# p+ [版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 G+ k5 I1 S& W+ K7 g$ X/ m! f原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
2 B/ ^1 i' F7 V& N' z" Q/ K, v4 p0 J2 v4 q7 v; M0 \; w( u3 E5 a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-2 16:13 , Processed in 0.122889 second(s), 19 queries .

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