SQLx 是一個非同步的、純粹的 Rust SQL 板條箱,其特點是沒有 DSL 的編譯時檢查查詢。
- 真正的非同步:從頭開始使用非同步/等待構建,以實現最大的併發性。
- 編譯時檢查查詢:
- 支援: PostgreSql,Mysql,Sqlite,MSSSQL
- 純rust編寫
- 在不同的執行時:async-std、tokio、actix和TLS natice-tls、tustls
- 跨平臺,SQLx 將在任何支援 Rust 的地方編譯。
- 使用 sqlx: : Pool 的內建連線池。
- 行流: 從資料庫非同步讀取資料並按需解碼
- 自動語句準備和快取。當使用高階查詢 API (sqlx: : query)時,每個連線準備和快取語句。
- 支援的傳輸層安全性(TLS)(MySQL 和 PostgreSQL)。
- 對 PostgreSQL 使用 LISTEN 和 NOTIFY 的非同步通知。
- 支援儲存點的巢狀事務
- 任何用於在執行時更改資料庫驅動程式的資料庫驅動程式。AnyPool 連線到 URI 方案指示的驅動程式。
資料庫的格式(user表)
id varchar 64
user_name varchar 30
create_time timestamp
age int 2
height float4 24
編寫查詢的程式碼,因為我們的資料庫欄位中存在時間型別,所以需要先引入chrono的包,和sqlx的shrono的feature,完整的toml
[dependencies]
sqlx = { version = "0.5", features = [ "runtime-tokio-native-tls" , "postgres","all-types","macros" ] }
tokio = { version = "1", features = ["full"] }
#時間
chrono = {version = "0.4.19",features=["serde"]}
#序列化
serde = {version = "1.0.140",features=["derive"]}
serde_json = "1.0.82"
需要用到的引用
use sqlx::{postgres::PgConnection, Connection, Postgres};
use serde::{Deserialize,Serialize};
建立user結構體
#[derive(Deserialize,Serialize,Debug,sqlx::FromRow)]
struct User{
id:String,
nick_name:String,
age:i16,
create_time:chrono::NaiveDateTime,
height:f32
}
建立單連結
async fn sql_connect() -> Option<PgConnection>{
let connect = PgConnection::connect("postgres://postgres:joyspace2_pwd@localhost:5432/test").await;
match connect {
Ok(conn) => {
Some(conn)
},
Err(err) => {
println!("err message: {:?}",err);
None
}
}
}
增加
async fn _insert_user(connect: &mut PgConnection,user: User){
let sql = sqlx::query::<Postgres>("insert into sys_user (id,nick_name,age,create_time,height) values ( $1,$2,$3,$4,$5 )")
.bind(user.id)
.bind(user.nick_name)
.bind(user.age)
.bind(user.create_time)
.bind(user.height)
.execute(connect).await;
match sql {
Ok(result) => {
println!("{:?}",result);
},
Err(err) => {
println!("{:?}",err);
}
}
}
查詢
async fn _select_user(connect: &mut PgConnection){
let res = sqlx::query_as::<Postgres,User>("select id,nick_name,age,create_time,height from sys_user").fetch_all(connect).await;
match res {
Ok(result) => {
println!("{:?}",result);
},
Err(err) => {
println!("err = {:?}",err);
}
}
}
修改
async fn update_user(connect: &mut PgConnection,nick_name:String,id:String){
let res = sqlx::query("update sys_user set nick_name = $1 where id = $2")
.bind(nick_name)
.bind(id)
.execute(connect).await;
match res {
Ok(result) => {
println!("{:?}",result);
},
Err(err) => {
println!("{:?}",err);
}
}
}
刪除
async fn _delete_user(connect: &mut PgConnection,id:String){
let res = sqlx::query("delete from sys_user where id = $1").bind(id).execute(connect).await;
match res {
Ok(result) => {
println!("{:?}",result);
},
Err(err) => {
println!("err= {:?}",err);
}
}
}
main方法
#[tokio::main]
async fn main() {
let user = User {
id:"".to_string(),
nick_name:"".to_string(),
age:19,
create_time:chrono::NaiveDate::from_ymd(2016, 7, 8).and_hms(9, 10, 11),
height:175.1
};
let connect = sql_connect().await;
if let Some(mut conn) = connect {
//呼叫方法
update_user(&mut conn, "新暱稱".to_string(), "123".to_string()).await;
}
println!("Hello, world!");
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結