SQLx是一個(gè)Rust語(yǔ)言的異步SQL數(shù)據(jù)庫(kù)訪問庫(kù),支持多種數(shù)據(jù)庫(kù),包括PostgreSQL、MySQL、SQLite等。本教程將以SQLite為例,介紹SQLx的基礎(chǔ)用法和進(jìn)階用法。 基礎(chǔ)用法連接數(shù)據(jù)庫(kù)首先,需要在Rust項(xiàng)目中添加SQLx庫(kù)的依賴: [dependencies]sqlx = '0.6'sqlx-core = '0.6'sqlx-derive = '0.6'sqlx-macros = '0.6' 然后,可以使用以下代碼連接SQLite數(shù)據(jù)庫(kù):
這里使用了SqlitePool連接池,可以在多個(gè)線程中共享連接。SqliteConnectOptions用于配置連接選項(xiàng),這里指定了SQLite數(shù)據(jù)庫(kù)文件的路徑。 創(chuàng)建表下面的代碼演示了如何使用SQLx創(chuàng)建一個(gè)名為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語(yǔ)句,execute方法用于執(zhí)行語(yǔ)句。可以看到,SQL語(yǔ)句與普通的SQL語(yǔ)句沒有太大區(qū)別。 插入數(shù)據(jù)下面的代碼演示了如何使用SQLx向users表中插入一條數(shù)據(jù):
這里使用了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ù):
這里使用了UPDATE語(yǔ)句更新數(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語(yǔ)句刪除數(shù)據(jù)。 進(jìn)階用法事務(wù)下面的代碼演示了如何使用SQLx進(jìn)行事務(wù)操作:
這里使用了begin方法開啟一個(gè)事務(wù),可以在事務(wù)中執(zhí)行多條SQL語(yǔ)句。如果所有語(yǔ)句執(zhí)行成功,可以使用commit方法提交事務(wù),否則可以使用rollback方法回滾事務(wù)。 批量插入下面的代碼演示了如何使用SQLx進(jìn)行批量插入操作: 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方法綁定多個(gè)參數(shù),可以將多個(gè)參數(shù)一次性綁定到SQL語(yǔ)句中,避免了多次執(zhí)行SQL語(yǔ)句的開銷。 總結(jié)本教程介紹了SQLx的基礎(chǔ)用法和進(jìn)階用法,包括連接數(shù)據(jù)庫(kù)、創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)、更新數(shù)據(jù)、刪除數(shù)據(jù)、事務(wù)和批量插入。SQLx是一個(gè)非常方便的異步SQL數(shù)據(jù)庫(kù)訪問庫(kù),可以大大提高開發(fā)效率。 |
|