管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。, L+ J4 Y% a; ? {& p5 i. K
! Y( X, h8 @0 E一、数据插入 - INSERT
. h+ _$ E) H0 J) V: U1 ^1 O8 z, Y, y* ]: }1 f% R
1.1 : DLang 插入数据2 X0 ]; q: ]% T3 G N Y7 ^6 n
4 \- t, W( z! S! U& [import std.stdio;/ a6 B6 h$ f0 Y1 e
+ w5 _' C$ u6 n6 c+ y3 E8 L8 b. v
import hunt.database;
# n( ?* e) A! a6 s4 m& s- x1 B3 A
) X4 V' f& W: M$ V: } w+ n6 cvoid main()
1 J; q: }" O( [0 n) x+ z9 `! H! u8 s
{$ I; ~- I5 Z2 O5 t( K1 k( S4 o8 f
5 G, S1 u: ^; d! w
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");6 N" K+ L8 ]4 J' C% z8 z; C) Q
; {# i* C: R) c3 H! ^int result = db.execute(`INSERT INTO user(username) VALUES("test")`);
$ Q$ p) L2 E& N- j( f3 Z5 Y- Y
$ T! O) C& {4 U0 L! N// 打印插入数量5 G4 @- w- N. e- l( i- u
4 d# {0 ~! `* d! I5 u5 m. l" y- A5 m
writeln(result);
9 V) Z) R0 T" c* y7 J' Y1 `
1 H, y+ O. A* k6 ]' r. @8 D* V2 Vdb.close();
" |' m. z0 P1 T* p% P
9 ^, Q, h( o0 ], ~% j, T}
: ]! s" t+ _# c3 D5 o; T% g% R" _1 s5 J' }9 R6 ^: N7 U- q" I" z: @
1.2 : Rust 插入数据
; @9 H8 s# x3 f8 I) u. d) t3 T4 Z* l; V- C; p1 |
extern crate postgres;
! G5 M' @% M* R- R: |5 ]- U2 X, N' @+ ]. E# j k
use postgres::{Connection, SslMode};. L2 S' ?$ w8 |% R6 `- x; ]% d
% t& o2 k$ }2 ^# {% I/ Z
fn main() {
* k& c8 b6 r3 a2 O3 J9 f1 l- ~+ v* E9 q& j8 u
let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();
4 [8 u, G# e0 V5 q% {, _
" y: \3 P! d" Y cconn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();
# U& u, k) S9 P0 b: z+ B- M% W1 v$ J* i+ ]( R2 }! n
}
2 D* O) X5 Q# v% c& A. q" W$ b; H2 Z: ?" c) C2 E* g
1.3 : Golang 插入数据4 D) n. L; ^+ f9 U1 B
! G( F6 Y! x; U& C# `: C
import (, ^; H* M. i" ?$ O7 H, Y% s" I8 ]
9 G3 N m+ d0 `"database/sql" K* C# [3 k& v" U+ W* Z; r
2 X" B; z" x# V' Q) D5 C
"fmt"
! s5 ^# ]( g: W8 `" ^- |$ ]' |6 J m/ a O- Z: a
_ "github.com/lib/pq"
/ w# t! L* b8 d1 z4 o
0 X7 U% k+ i& a8 k$ `0 k"time"
. v* s1 U- X7 p$ h. @: r, z$ ?, J5 `0 F5 l# u0 V" M
"log"
" K; o2 P2 N4 }, P9 L, @& ]! @6 {! E( h/ B" p$ L
)& @/ A: X0 V" O8 E, `. N( ^- C
/ B/ x" v+ ]' F9 Z
func main() {
& | r& L' N/ R) s# b' \7 X
* l; o$ I- X4 Kdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
. i" F( a, C3 S
5 H. B6 ^. p7 ]1 ^if err != nil {7 }+ t, S7 ?' o }9 L- x
) Q. c3 H: p2 Q: xlog.Fatal(err)
$ _& x, ~7 j: v* K: E- P0 Y/ |( {3 ] C8 G. r7 K; p/ j$ `; _) _9 d
return nil N! x1 p- }6 y. E! o# q( @
0 q1 I+ B0 ` [( n* S
}
4 {# ^3 c2 k8 d$ Y" }" I& s
( L5 U7 o, F# R D" F4 Lstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
2 @/ n" s$ P) I) i7 V% T d: S* O# \9 F. O8 h, d) I6 d9 @
stmt.Exec()2 n V3 Y/ W+ J# L" y/ y
# D2 R8 ^) y2 S2 E3 Z/ [: F. I3 `
stmt.Close()( s: C5 a: S5 M' H1 w3 K1 E
9 i% w0 x/ J+ t8 \+ h}
# v. S6 F2 V E
( \2 ?$ c% q; }4 t- F/ ~. L$ Y二、数据查询 - SELECT/ \8 F2 G" h0 l- X: v
3 y+ O1 R- z4 L% ?' f: ?! M2.1 : DLang 查询数据) w1 _ l4 S! w$ c
: U$ ^$ k! B- h$ F
import std.stdio;7 }( m' T& B1 k: v: J! @* ^4 y
0 Z+ g s! V# ^7 g/ u0 b+ b5 E1 Jimport hunt.database;0 F0 z# F$ o; U( e1 i+ E
: y% [9 Y0 j8 @4 H! K F% V- `void main()
# I# e- Z4 I% t4 X, q- A5 g9 x6 y0 @9 E- \
{
1 A0 ] F- w) |/ }0 R2 F* N9 q! ^# ?# K
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
" x$ f: }5 U6 Z, I
2 y( T C* I2 n5 p( ?foreach(row; db.query("SELECT * FROM user LIMIT 10"))
/ e- i+ p( k6 q0 C. ?' k8 `, V4 `' @ i& G/ ]& y1 P
{* v& G; t0 D8 t; x) R1 i2 G
. N# M1 T4 C0 f' A4 y, \& mwriteln(row["username"]);
# R4 ~; Y3 y9 A; k
9 m. U$ j: t4 J$ }- k}) _/ f0 u7 F, y
& V8 Z/ B* C$ _8 q: l. edb.close(); s" T. v: A( V; N) g: Q- b
5 Z& W% T, K; I' g( f! M}2 s8 d: V' z C
1 N# M/ V. }% ]( }2.2 : Rust 查询数据2 V# M+ u) C7 D- D7 H* n
& ^% s! i- y5 X$ w* z) rextern crate postgres;3 s/ T7 T0 s9 C8 d) L
y/ n/ L# K* q) [) w$ w, D
use postgres::{Connection, SslMode};
. c' o1 v* @ H# E! ?6 H6 [9 E" l9 b, Y. K' `+ N+ u& t
fn main() {8 g e, S+ d. O: N
% o5 m0 N% Y8 |9 [let conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap(); O6 F( R' E6 p0 K/ @& V# h6 @
/ H+ e' K. v. @! M. F; F
for row in &conn.query("SELECT * FROM user", &[]).unwrap();8 F9 P- ?; Z5 D; o
7 L: w$ w. P2 |# u. u F/ d! j2 K
println!("Found person {}", row.get(0));8 B# K# b l9 ? M3 F) e
& D" o, v. w: o, N0 ~! g6 _
}
# O, [ k! o, n# l$ z
7 p$ [6 C! G9 Y; B* S% J}. j( k4 J( r, G o& d2 C
9 }5 E# c, ^' l2.3 : Golang 查询数据6 j" {, ^2 J( A' |
! r- t( J! y5 o' Z7 M% f! x) ?
import (
2 G6 b. H4 K: N( N
+ L( X9 |, J6 ]9 {" c"database/sql", ~3 I( I) Q, l' w7 @
# l' Z# I; j0 c$ e. m; L2 H$ [8 i
"fmt"& `* E3 ?! ~+ n
) k" V7 F1 S, R/ q* ~& V
_ "github.com/lib/pq"
1 F8 _" K! V4 A# s4 u( q) d8 L' h) j# L1 Q! V
"time"
/ h& G! v' f+ m; I6 I/ [0 c( H
, h9 X$ ~" A0 b! F6 `"log"& [% U) O/ r& t1 v# @0 e
+ l* f# O, z3 K: A
)0 s; B% o# M( U) E
! u& x3 `4 J( n6 a4 Ftype User struct {. w% f2 Y& l9 V
+ @6 _& I7 a& h" s3 J* T* d; i
UserName string
$ p( {/ o* ~5 R* ]. L4 f
( L! E* t F6 r; S1 h' Z}
5 P. v n. |% j0 J: o% b$ c$ s3 y/ }+ ^( T- q2 ]
func main() {) F" O8 u1 g u. W
! ]" ^' _7 e2 s& o6 S. S, S9 f4 d
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
8 i% S! E, E/ d9 @% q6 w2 A2 C* f+ I3 L% a% U% ]1 d4 r
if err != nil {
! x( W" u Z$ W$ u f
& v2 f; M( X9 p2 S$ W' I. _2 \log.Fatal(err)
4 y& n0 p) R, }. A/ m! O6 ~/ E x+ _! i6 L- P
return nil: t. v9 I# ]" H, ?$ }* ~& q9 ?
_: Z) L4 n( ^# u, S" F# ?% W* @" y}
# E+ E6 {3 v! A: C- r6 a: g6 H* |* j/ [% z9 y" x0 u# D+ p: b
user := User{}
5 J( U8 H, U% r5 g" q
: s; ^0 p @# t& Fstmt := db.Query("SELECT * FROM user")
0 L' d: i6 `5 J( i- H X
4 @( N. g/ w3 T0 G; Afor rows.Next() {/ t0 r' @: U, ~5 n- G5 w
8 Z* S/ r$ ]8 d! ^
rows.Scan(&user.UserName)
+ Y6 j0 F7 m5 b+ d: y- L2 \; M+ }6 y& p* j7 C( o3 a
fmt.Println(user.UserName)
1 x3 V$ g3 f/ r7 {& g7 x2 |7 Y, g; E. P% ~2 v. P7 z9 q- P
}" D6 M2 O) e9 G# H6 K
' L; L, ]# T M0 W9 i7 \
stmt.Close()7 [+ O Z) d% _; e) M/ e
& c4 h. q: `6 w- L6 ^% i/ U) d}
3 D) B2 H; i: ^$ C ]$ K9 n |' i, f* T! J
三、总结
7 I6 {; e1 z: h& ]$ S* ^& K
( p# }8 b1 o' ~& N, s对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。4 Z4 C; i5 z$ l2 i9 ?# U8 L$ w0 G
$ o; {- v; V" e' _
这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)
4 u0 a# m8 G( B6 x% h9 [) {0 h& s$ [
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
% a; Z- ]0 W# p: N$ }
, p7 { N; q' I4 s! K' B- D总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
6 F& F+ k8 X( h: j$ W————————————————' @) m# w1 ?( q9 { c. ?
版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 \0 y/ q* R6 I7 z I8 o
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961$ Q8 c; s1 k1 ]3 B
& D. B# z6 x$ L% Z1 N- I/ t
|
|