一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Rust語(yǔ)言從入門到精通系列 - SQLx模塊SQLite入門

 剩礦空錢 2024-04-23 發(fā)布于湖北
Rust語(yǔ)言從入門到精通系列 - SQLx模塊SQLite入門

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ù):

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連接池,可以在多個(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ù):

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語(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ù)操作:

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方法開啟一個(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ā)效率。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日本和亚洲的香蕉视频| 两性色午夜天堂免费视频| 婷婷开心五月亚洲综合| 精品欧美日韩一二三区| 中文字幕亚洲精品人妻| 国产又大又硬又粗又湿| 日本不卡在线一区二区三区| 久久精品中文字幕人妻中文| 麻豆精品视频一二三区| 国内女人精品一区二区三区| 激情内射日本一区二区三区| 国产精品第一香蕉视频| 国产又粗又猛又长又大| 青青操日老女人的穴穴| 成年午夜在线免费视频| 日韩欧美精品一区二区三区| 大尺度剧情国产在线视频| 九九热精品视频免费在线播放| 91精品视频全国免费| 免费黄色一区二区三区| 国产成人免费高潮激情电| 91人妻人人做人碰人人九色| 亚洲高清亚洲欧美一区二区| 日本精品最新字幕视频播放| 国产午夜在线精品视频| 欧美一区二区三区性视频| 国产无摭挡又爽又色又刺激| 日韩欧美精品一区二区三区| 亚洲国产精品一区二区毛片| 亚洲精品欧美精品一区三区| 激情偷拍一区二区三区视频| 人妻熟女欲求不满一区二区| 四季精品人妻av一区二区三区| 丰满熟女少妇一区二区三区| 免费在线播放不卡视频| 亚洲一区二区三区四区| 欧美尤物在线观看西比尔| 日韩无套内射免费精品| 色综合久久六月婷婷中文字幕| 91欧美一区二区三区| 色哟哟在线免费一区二区三区|