管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
我们使用 DLang / Rust / Golang 在服务端开发的时候对数据库操作是家常便饭,而对于所谓的系统级编译型语言来说操作数据库可能没那么方便,不像 PHP 和 JAVA 那样,对于比较新的三个编译型语言我们来看看效果,刚好这三个语言的语法差异比较大。
1 m7 @! x# L. I( F3 I' }" m. B4 h# `, l' D/ r7 c) l
一、数据插入 - INSERT
$ R& _9 ~% g7 L; W; `& B( s7 T( ?6 h' m
1.1 : DLang 插入数据
! L3 P" n- l# ?3 N% t Z" N5 _* c2 X/ T1 w
import std.stdio;
2 e9 X* ?8 ]' c: r6 N9 X' u" I# S" Y9 s% g8 ~/ H
import hunt.database;9 W) [- `. N4 e0 j' Z
) M3 F- o; c0 z9 ~* I+ h2 bvoid main()8 [5 X4 m9 i' V2 g/ k9 h K
# V8 K. i: b9 v y{
0 P, z& y. X) x# v/ c- U. g2 u, }! X" ?( }9 f6 P4 h2 l' T c9 T, y* M
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
6 t# u% M' J2 d0 s2 Z
/ U8 G; a' N/ K/ B& r( o& hint result = db.execute(`INSERT INTO user(username) VALUES("test")`);5 _7 w' p/ H8 c! G6 m# F
0 v2 }" Y4 J4 w, S
// 打印插入数量
. Y' s. u7 S3 g8 G1 s: x% _: T
. ]! \7 y3 p- R% pwriteln(result); T5 ]& o! A/ U& T
! u! ^9 _( L5 {9 D" Ndb.close();
g8 u2 ^! D7 \* I3 w8 L T+ j
& h6 _% w- |; a# K* q' b ]3 m}! f, t7 {7 K7 k7 U$ P! F
- U/ _. y1 H* S; X* ?
1.2 : Rust 插入数据0 e9 {# ^+ O3 `4 ~) h. w0 k7 G- D
- p" L! g% ?/ y/ ?' p4 I" L" D# _
extern crate postgres;2 C8 K- ~4 i5 W. C+ K
) B5 {( p# `) w, r3 T2 o7 D! v+ L
use postgres::{Connection, SslMode};
# Y) a; [" R$ d6 [' s
4 H7 }- E/ m( O1 Tfn main() {9 `+ Q; o$ z! f" o W; i" j
' e4 `3 |8 ~- ]4 _! U5 nlet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();8 u" i; }8 x6 z, F2 B( c
. W/ R* |- Y/ c* y0 f5 \
conn.execute("INSERT INTO user (username) VALUES (\"test\")", &[]).unwrap();. s* d' c7 n" S8 a' T
: H+ k$ J. B" @5 j}
- A: X w! v3 K
8 P' r) L2 I3 X& s8 ~7 _1.3 : Golang 插入数据
' t& s- n% h. ~7 L7 j; O, b
( D5 g+ z* j8 _! [: d8 V* X( timport (4 G ` u J- g2 s: v1 C) ^: A
7 e7 o+ d1 t! V1 \& W2 j8 ~
"database/sql"
# j# O1 K6 f9 I+ H+ Y/ [/ b$ x1 m
8 K5 Z' ^4 N3 N; m5 ~4 {"fmt"
- x6 @ Z$ e% R9 ~! [# ^, q
: d2 w& k2 Y4 U7 R_ "github.com/lib/pq"
8 G7 Q) Y5 v' X$ Q
) r' B s6 ~7 ~- h"time"$ b5 r( ` O$ Y8 |9 z2 O5 `4 q5 c
; N( D( m8 q3 E) w/ _8 y- O"log"
8 U% y4 H7 ^, \" b
' ]; [5 W. U2 p' b$ e6 ?)
" c3 J' D/ S K/ g
) e& t. B4 I# J$ W* ]/ Xfunc main() {5 | c! v5 U6 x% u/ ~
9 E: w, E3 R" }3 zdb, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")+ l. W8 d* g7 ~3 J! H5 \
$ ?2 D) t. X% u7 O: [' hif err != nil {
9 K0 @0 ?; N' _' a+ A6 H7 K0 w" F2 r
log.Fatal(err)
- T& _. u6 }2 `' {( t
+ v, c1 M8 M* [7 G q/ Y! j1 j5 E$ jreturn nil
( W+ S6 Z% M( r& u& ]( O+ r% |2 F4 E3 ]# E+ w1 _' z
}7 ? b {" K. @$ Z+ F
, a* R2 H$ I+ v. A4 u& bstmt := db.Prepare("INSERT INTO user (username) VALUES (\"test\")")
, w$ e: J: a( W. |3 f4 ^- \# ]$ p; @) Y* L+ I
stmt.Exec()
$ {: i5 o% u/ Z; J: N q0 |( \
: Y6 E, K" @5 }: J* bstmt.Close()* ^3 b" ]# A+ ~! a- ^
1 D" {. i+ e8 A& C; o# f6 U}/ S+ R! V# l; r1 I
# E2 g5 o8 v+ _1 J3 w二、数据查询 - SELECT
$ o e! H9 L: r1 d" X& k2 @) z
H$ P1 C$ ]" H% s; b7 P8 |2.1 : DLang 查询数据
+ {; \8 C1 p# b1 z/ \) Y5 x9 t. A- Y4 q4 B4 W' t
import std.stdio;% @8 j. L& O- e2 E& k
: R0 H" z r5 W. I. K; e+ [0 T7 Y( z
import hunt.database;6 a" d6 v, d- J R) W
7 p8 @! ?. o4 |, M* D. v! rvoid main()' U2 \5 z5 O& W! A
; J4 {0 X4 b" |6 W& y
{
$ c* u7 \7 @1 t' V1 A: M" F9 j/ w3 Z, g2 E
auto db = new Database("mysql://root:123456@localhost:3306/test?charset=utf8mb4");
3 ^3 x" n" c: r- G+ D2 V9 N. H7 o) w' n- f5 s2 |! I
foreach(row; db.query("SELECT * FROM user LIMIT 10"))
, O W" w9 i! J1 ?8 R4 d
# ^8 ]- j$ R/ y6 F- P{: e5 h; R0 U# S9 g5 @3 e, G
) b% L* e- \/ \2 F$ ^writeln(row["username"]);
* D# N! C0 K3 q" w0 [# G
) ^9 X# Y, \3 j' ^3 |. I}
& X9 g) A. ~! a9 N5 H6 D7 o0 \
' P4 p& H( T7 g, `' I# cdb.close();
- T- n. W& v0 M
! M1 ?6 }: } r" s% ~- S! L& O}8 s1 [; G7 m4 u: H3 b
" i/ l9 o* j. U. B- d
2.2 : Rust 查询数据
) A4 a3 y: z$ [2 O8 h! c3 J' G+ n; S
extern crate postgres;% T N/ J5 N# O. G. ?! i
" V% ^' C" Z4 U% v R1 k# uuse postgres::{Connection, SslMode};( E6 J3 a& [ ]* s' e4 e/ w1 t. W; F
$ b$ D' O9 b$ a6 p6 F% C Afn main() {& j. r9 x9 Q! r2 ]0 i/ ^
& n" |. A( L' x- m( `" o Y/ o5 N9 Klet conn = Connection::connect("postgres://postgres@localhost", SslMode::None).unwrap();7 v) X* a8 ^$ I" D$ ?) n. I
0 @5 m2 ?0 g6 S2 M/ B) O
for row in &conn.query("SELECT * FROM user", &[]).unwrap();
: Q4 g! B: C7 n$ P6 x5 O6 \, p
; P9 l0 Z' t7 {" h1 f' l4 Mprintln!("Found person {}", row.get(0));
) S5 \1 c- k8 @- b/ K1 [, K& o6 Y* h
( l8 `4 u+ G( H( _: D}
; |: n( W2 K m6 q" K* `9 T% t! d+ p$ k/ Y+ d n; z* L' {% O
}/ s+ l8 c, u& [7 k
: M; R X |6 o/ y" p
2.3 : Golang 查询数据5 F& C! o- [! e6 U# Q b( X% b
+ M4 {3 K+ _+ cimport (
( _* f) f3 F2 O& ^# v
8 k: y2 o2 Q0 `& I% O$ W+ ^"database/sql"
0 l2 }* e* Q; [) T+ o2 _8 B5 D3 \ E" Q8 k
"fmt", v! }* k' r4 y7 g; _
# d* O5 w) M% b1 S5 f! k8 l4 { @_ "github.com/lib/pq"
$ D) U1 Z+ g: P, h8 x1 |4 V6 b
! p+ L. v% y- V"time"
. z# W" c: i" B6 U! \" q3 ~
! C* X7 E7 a% x! x$ |$ k"log"! E7 _9 q% i7 \' m+ l
( b- S* ]% {8 n6 }+ y2 B. U Q)
: k) P" e3 T& g3 i5 g, C9 M$ g! P* F* j1 ~6 p6 e% ?% A+ K
type User struct {
0 R. F% c- H( V# A" o3 V; Z" d( C
U, u( R6 x3 U* V/ OUserName string! x8 H3 \) i7 L7 q N. a/ p
5 ]0 \" |# L0 N8 M) e9 P
}5 P# J3 p5 Y* s; V# K) m7 T5 G
8 I# ]( y" X1 \, l, I9 M/ tfunc main() {# S, L' @) E4 S; \8 J
/ W+ d8 p/ G ?- k, S. J
db, err := sql.Open("postgres", "user=portgres password=123456 dbname=test sslmode=disable")
' k: [: ~3 A. G8 g$ |* N. U
+ T# X: @7 A* V8 B# Sif err != nil {
% C3 l0 A6 P ^; E4 l9 P' r: L
log.Fatal(err)
0 l4 U* W8 L- z+ i% h
) R2 Z6 D0 J. S5 Qreturn nil
/ B1 g' ~2 ]/ R; `3 O
$ }- h* ?- p3 S; D9 @) f}; f& }& o2 {5 A7 Z/ V, p$ v* W
4 H6 h5 C2 V# w: Ouser := User{}7 V6 |" J# z/ c3 J
: _4 Q! `7 E) L2 S" Kstmt := db.Query("SELECT * FROM user")
4 X' B+ @% o8 x; S$ i
& k. v h. ^9 j* Z' J& A0 L4 ^for rows.Next() {6 s# _) e( d8 R/ ?" g
1 }) g# Q, F+ i* T% `- e- U
rows.Scan(&user.UserName)7 R; u9 J: U& T4 x* E4 a6 A2 U( X% ~
. Q) {0 T& f$ pfmt.Println(user.UserName)
- i1 _' q# L3 i% i( T% r6 a1 e1 V. `5 Y% f4 s" R _' a( B J
}2 u% m0 @; @3 F9 L3 W, r6 O3 A
/ _( v9 _9 j! p5 y( `) C2 V, e
stmt.Close()
! u2 R: e9 n* S: R2 x) v2 F9 ~, x' c
}+ C& W& J; F, ?% r
3 l2 w6 ?* t! Z8 w9 q
三、总结; z8 H# |0 B! @: C: B
3 ]9 p) W' {7 @对于操作数据库来说静态类型语言的确不是很容易操作,类似 C++ 这么多年还没有相对容易使用的数据库操作的 library,但无论 Dlang / Rust 和 Golang 都能比较全面的操作数据库。
0 s7 [+ q8 k0 i1 U# j9 l* G% v
0 _& Y" P9 H( N4 {, g: N这三个语言的语法还有比较大的差异,DLang 语法可读性比较好(的确简单的像PHP一样方便了),Rust 相对来说操作符会多一些,而 golang 在执行 SELECT 之后需要创建对象绑定,不支持字段作为 key 的操作形式?(可能是我功课没做好)- l6 {# K2 B/ H1 ~+ z7 {, P
" K- X+ J, r/ n" ?4 |$ E- J
在包引入方面 Dlang 最简单,Rust 相对来说颗粒度控制的更细,而 Golang 相对繁琐一些,需要几个包同时引入才可以操作数据库;相对 Rust 和 Golang 来说 Dlang 可以更方便的切换不同数据库而不需要修改业务逻辑代码。
- c+ c* C% _" `4 b" q: @2 H4 _ m; \& p0 Z8 ?3 i
总而言之系统级语言在服务端的应用日益增多,更多有意思的对比还需要大家一起来挖掘,不要沉浸在单一的脚本语言如 PHP、虚拟机语言 JAVA 和 C#,多多学习,现在语言的学习成本已经非常低,我们应该在不同的应用场景使用更适合的开发语言。
3 V I& ?) H, H9 Z! ?- W————————————————
# ^6 ^# e1 G T8 t+ i版权声明:本文为CSDN博主「游戏葡萄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 L3 v: t$ n$ r( }8 F, T X4 u, h
原文链接:https://blog.csdn.net/weixin_30713705/article/details/113633961
- R! o, C- E3 z) b! b$ B: ?) Q% q4 k! e7 O! i3 [3 C- t
|
|