SQLx是一個Rust語言的異步SQL數(shù)據(jù)庫訪問庫,支持多種數(shù)據(jù)庫,包括PostgreSQL、MySQL、SQLite等。本教程將以SQLite為例,介紹SQLx的基礎(chǔ)用法和進階用法。
基礎(chǔ)用法
連接數(shù)據(jù)庫
首先,需要在Rust項目中添加SQLx庫的依賴:
[dependencies]
sqlx = "0.6"
sqlx-core = "0.6"
sqlx-derive = "0.6"
sqlx-macros = "0.6"
然后,可以使用以下代碼連接SQLite數(shù)據(jù)庫:
use sqlx::{SqlitePool, sqlite::SqliteConnectOptions};
#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
let database_url = "sqlite:mydatabase.db";
let options = SqliteConnectOptions::new()
.filename(database_url);
let pool = SqlitePool::connect_with(options).await?;
Ok(())
}
這里使用了SqlitePool
連接池,可以在多個線程中共享連接。SqliteConnectOptions
用于配置連接選項,這里指定了SQLite數(shù)據(jù)庫文件的路徑。
創(chuàng)建表
下面的代碼演示了如何使用SQLx創(chuàng)建一個名為users
的表:
use sqlx::{query, SqlitePool};
#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
let pool = SqlitePool::connect("sqlite:mydatabase.db").await?;
query("CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
)").execute(&pool).await?;
Ok(())
}
這里使用了query
宏執(zhí)行SQL語句,execute
方法用于執(zhí)行語句。可以看到,SQL語句與普通的SQL語句沒有太大區(qū)別。
插入數(shù)據(jù)
下面的代碼演示了如何使用SQLx向users
表中插入一條數(shù)據(jù):
use sqlx::{query, SqlitePool};
#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
let pool = SqlitePool::connect("sqlite:mydatabase.db").await?;
query("INSERT INTO users (name, email) VALUES (?, ?)")
.bind("Alice")
.bind("alice@example.com")
.execute(&pool)
.await?;
Ok(())
}
這里使用了bind
方法綁定參數(shù),可以避免SQL注入攻擊。
查詢數(shù)據(jù)
下面的代碼演示了如何使用SQLx查詢users
表中所有數(shù)據(jù):
use sqlx::{query_as, SqlitePool};
#[derive(Debug, sqlx::FromRow)]
struct User {
id: i32,
name: String,
email: String,
}
#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
let pool = SqlitePool::connect("sqlite:mydatabase.db").await?;
let users = query_as::< _, User >("SELECT * FROM users")
.fetch_all(&pool)
.await?;
println!("{:?}", users);
Ok(())
}
這里使用了query_as
宏查詢數(shù)據(jù),并使用FromRow
特性將查詢結(jié)果轉(zhuǎn)換為User
結(jié)構(gòu)體。fetch_all
方法用于獲取所有查詢結(jié)果。
更新數(shù)據(jù)
下面的代碼演示了如何使用SQLx更新users
表中的數(shù)據(jù):
use sqlx::{query, SqlitePool};
#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
let pool = SqlitePool::connect("sqlite:mydatabase.db").await?;
query("UPDATE users SET email = ? WHERE name = ?")
.bind("alice@example.org")
.bind("Alice")
.execute(&pool)
.await?;
Ok(())
}
這里使用了UPDATE
語句更新數(shù)據(jù)。
刪除數(shù)據(jù)
下面的代碼演示了如何使用SQLx刪除users
表中的數(shù)據(jù):
use sqlx::{query, SqlitePool};
#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
let pool = SqlitePool::connect("sqlite:mydatabase.db").await?;
query("DELETE FROM users WHERE name = ?")
.bind("Alice")
.execute(&pool)
.await?;
Ok(())
}
這里使用了DELETE
語句刪除數(shù)據(jù)。
進階用法
事務(wù)
下面的代碼演示了如何使用SQLx進行事務(wù)操作:
use sqlx::{query, SqlitePool, SqliteTransaction};
#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
let pool = SqlitePool::connect("sqlite:mydatabase.db").await?;
let mut tx = pool.begin().await?;
query("INSERT INTO users (name, email) VALUES (?, ?)")
.bind("Alice")
.bind("alice@example.com")
.execute(&mut tx)
.await?;
query("INSERT INTO users (name, email) VALUES (?, ?)")
.bind("Bob")
.bind("bob@example.com")
.execute(&mut tx)
.await?;
tx.commit().await?;
Ok(())
}
這里使用了begin
方法開啟一個事務(wù),可以在事務(wù)中執(zhí)行多條SQL語句。如果所有語句執(zhí)行成功,可以使用commit
方法提交事務(wù),否則可以使用rollback
方法回滾事務(wù)。
批量插入
下面的代碼演示了如何使用SQLx進行批量插入操作:
use sqlx::{query, SqlitePool};
#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
let pool = SqlitePool::connect("sqlite:mydatabase.db").await?;
let users = vec![
("Alice", "alice@example.com"),
("Bob", "bob@example.com"),
("Charlie", "charlie@example.com"),
];
query("INSERT INTO users (name, email) VALUES (?, ?)")
.bind_all(users)
.execute(&pool)
.await?;
Ok(())
}
這里使用了bind_all
方法綁定多個參數(shù),可以將多個參數(shù)一次性綁定到SQL語句中,避免了多次執(zhí)行SQL語句的開銷。
總結(jié)
本教程介紹了SQLx的基礎(chǔ)用法和進階用法,包括連接數(shù)據(jù)庫、創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)、更新數(shù)據(jù)、刪除數(shù)據(jù)、事務(wù)和批量插入。SQLx是一個非常方便的異步SQL數(shù)據(jù)庫訪問庫,可以大大提高開發(fā)效率。
-
參數(shù)
+關(guān)注
關(guān)注
11文章
1846瀏覽量
32329 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3839瀏覽量
64544 -
代碼
+關(guān)注
關(guān)注
30文章
4808瀏覽量
68815 -
SQLx
+關(guān)注
關(guān)注
0文章
2瀏覽量
46
發(fā)布評論請先 登錄
相關(guān)推薦
評論