0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SQLx在Rust語言中的基礎(chǔ)用法和進(jìn)階用法

科技綠洲 ? 來源:TinyZ ? 作者:TinyZ ? 2023-09-19 14:32 ? 次閱讀

SQLx是一個(gè)Rust語言的異步SQL執(zhí)行庫,它支持多種數(shù)據(jù)庫,包括MySQL、PostgreSQL、SQLite等。本教程將以MySQL數(shù)據(jù)庫為例,介紹SQLx在Rust語言中的基礎(chǔ)用法和進(jìn)階用法。

基礎(chǔ)用法

要使用SQLx,需要在Cargo.toml文件中添加以下依賴:

[dependencies]
sqlx = { version = "0.6", features = ["mysql", "runtime-tokio-rustls"] }
tokio = { version = "1", features = ["full"] }

連接數(shù)據(jù)庫

在使用SQLx之前,需要先連接數(shù)據(jù)庫。SQLx提供了兩種方式連接MySQL數(shù)據(jù)庫:使用URL連接和使用配置文件連接。

URL連接

使用URL連接時(shí),需要在代碼中指定連接字符串,例如:

use sqlx::mysql::MySqlPoolOptions;

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPoolOptions::new()
        .max_connections(5)
        .connect("mysql://username:password@hostname:port/database")
        .await?;
    // ...
    Ok(())
}

其中,usernamepassword是數(shù)據(jù)庫用戶名和密碼,hostname是數(shù)據(jù)庫主機(jī)名,port是數(shù)據(jù)庫端口號(hào),database是要連接的數(shù)據(jù)庫名。

配置文件連接

使用配置文件連接時(shí),需要在項(xiàng)目根目錄下創(chuàng)建一個(gè)名為.env的文件,并在其中指定連接信息,例如:

DATABASE_URL=mysql://username:password@hostname:port/database

然后在代碼中使用dotenv庫加載.env文件,并使用sqlx::MySqlPool::connect_dotenv()方法連接數(shù)據(jù)庫,例如:

use sqlx::mysql::MySqlPoolOptions;

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    dotenv::dotenv().ok();
    let pool = MySqlPoolOptions::new()
        .max_connections(5)
        .connect_dotenv()
        .await?;
    // ...
    Ok(())
}

查詢數(shù)據(jù)

連接成功后,就可以使用SQLx執(zhí)行SQL查詢語句了。SQLx提供了兩種方式執(zhí)行SQL查詢語句:使用query()方法和使用query_as()方法。

使用query()方法

使用query()方法執(zhí)行SQL查詢語句時(shí),需要手動(dòng)指定返回結(jié)果的類型,例如:

use sqlx::{MySqlPool, Row};

#[derive(Debug)]
struct User {
    id: i32,
    name: String,
}

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let mut rows = sqlx::query("SELECT id, name FROM users")
        .map(|row: sqlx::mysql::MySqlRow| {
            User {
                id: row.get(0),
                name: row.get(1),
            }
        })
        .fetch_all(&mut conn)
        .await?;

    for row in rows.iter() {
        println!("{:?}", row);
    }

    Ok(())
}

使用query_as()方法

使用query_as()方法執(zhí)行SQL查詢語句時(shí),可以自動(dòng)將返回結(jié)果轉(zhuǎn)換為指定類型的結(jié)構(gòu)體,例如:

use sqlx::{MySqlPool, FromRow};

#[derive(Debug, FromRow)]
struct User {
    id: i32,
    name: String,
}

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let mut rows = sqlx::query_as::< _, User >("SELECT id, name FROM users")
        .fetch_all(&mut conn)
        .await?;

    for row in rows.iter() {
        println!("{:?}", row);
    }

    Ok(())
}

插入數(shù)據(jù)

使用SQLx插入數(shù)據(jù)時(shí),可以使用execute()方法或execute_with()方法。

使用execute()方法

使用execute()方法插入數(shù)據(jù)時(shí),需要手動(dòng)指定插入的數(shù)據(jù),例如:

use sqlx::{MySqlPool, Row};

#[derive(Debug)]
struct User {
    name: String,
}

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let user = User {
        name: "John".to_string(),
    };

    let result = sqlx::query("INSERT INTO users (name) VALUES (?)")
        .bind(user.name)
        .execute(&mut conn)
        .await?;

    println!("{:?}", result);

    Ok(())
}

使用execute_with()方法

使用execute_with()方法插入數(shù)據(jù)時(shí),可以使用結(jié)構(gòu)體自動(dòng)映射的特性,例如:

use sqlx::{MySqlPool, FromRow};

#[derive(Debug, FromRow)]
struct User {
    name: String,
}

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let user = User {
        name: "John".to_string(),
    };

    let result = sqlx::query_with::< _, User >("INSERT INTO users (name) VALUES (?)", user)
        .execute(&mut conn)
        .await?;

    println!("{:?}", result);

    Ok(())
}

更新數(shù)據(jù)

使用SQLx更新數(shù)據(jù)時(shí),可以使用execute()方法或execute_with()方法。

使用execute()方法

使用execute()方法更新數(shù)據(jù)時(shí),需要手動(dòng)指定更新的條件和更新的數(shù)據(jù),例如:

use sqlx::{MySqlPool, Row};

#[derive(Debug)]
struct User {
    id: i32,
    name: String,
}

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let user = User {
        id: 1,
        name: "John".to_string(),
    };

    let result = sqlx::query("UPDATE users SET name = ? WHERE id = ?")
        .bind(user.name)
        .bind(user.id)
        .execute(&mut conn)
        .await?;

    println!("{:?}", result);

    Ok(())
}

使用execute_with()方法

使用execute_with()方法更新數(shù)據(jù)時(shí),可以使用結(jié)構(gòu)體自動(dòng)映射的特性,例如:

use sqlx::{MySqlPool, FromRow};

#[derive(Debug, FromRow)]
struct User {
    id: i32,
    name: String,
}

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let user = User {
        id: 1,
        name: "John".to_string(),
    };

    let result = sqlx::query_with::< _, User >("UPDATE users SET name = :name WHERE id = :id", user)
        .execute(&mut conn)
        .await?;

    println!("{:?}", result);

    Ok(())
}

刪除數(shù)據(jù)

使用SQLx刪除數(shù)據(jù)時(shí),可以使用execute()方法或execute_with()方法。

使用execute()方法

使用execute()方法刪除數(shù)據(jù)時(shí),需要手動(dòng)指定刪除的條件,例如:

use sqlx::{MySqlPool, Row};

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let result = sqlx::query("DELETE FROM users WHERE id = ?")
        .bind(1)
        .execute(&mut conn)
        .await?;

    println!("{:?}", result);

    Ok(())
}

使用execute_with()方法

使用execute_with()方法刪除數(shù)據(jù)時(shí),可以使用結(jié)構(gòu)體自動(dòng)映射的特性,例如:

use sqlx::{MySqlPool, FromRow};

#[derive(Debug, FromRow)]
struct User {
    id: i32,
}

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let user = User {
        id: 1,
    };

    let result = sqlx::query_with::< _, User >("DELETE FROM users WHERE id = :id", user)
        .execute(&mut conn)
        .await?;

    println!("{:?}", result);

    Ok(())
}

進(jìn)階用法

事務(wù)

使用SQLx執(zhí)行事務(wù)時(shí),可以使用begin()方法開始事務(wù),使用commit()方法提交事務(wù),使用rollback()方法回滾事務(wù)。

use sqlx::{MySqlPool, Transaction};

#[derive(Debug)]
struct User {
    name: String,
}

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let mut tx = conn.begin().await?;

    let user = User {
        name: "John".to_string(),
    };

    let result = sqlx::query("INSERT INTO users (name) VALUES (?)")
        .bind(user.name)
        .execute(&mut tx)
        .await?;

    println!("{:?}", result);

    tx.commit().await?;

    Ok(())
}

連接池

使用SQLx連接池時(shí),可以使用PoolOptions::new()方法創(chuàng)建連接池,并使用acquire()方法獲取連接。

use sqlx::{MySqlPool, PoolOptions};

#[tokio::main]
async fn main() - > Result< (), sqlx::Error > {
    let pool = MySqlPool::connect("mysql://username:password@hostname:port/database").await?;
    let mut conn = pool.acquire().await?;

    let pool = MySqlPool::builder()
        .max_size(5)
        .build("mysql://username:password@hostname:port/database")
        .await?;

    let mut conn = pool.acquire().await?;

    // ...

    Ok(())
}

總結(jié)

本教程介紹了SQLx在Rust語言中的基礎(chǔ)用法和進(jìn)階用法,包括連接數(shù)據(jù)庫、查詢數(shù)據(jù)、插入數(shù)據(jù)、更新數(shù)據(jù)、刪除數(shù)據(jù)、事務(wù)和連接池等。SQLx是一個(gè)簡(jiǎn)單易用的異步SQL執(zhí)行庫,可以幫助Rust開發(fā)者快速地與多種數(shù)據(jù)庫進(jìn)行交互。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    780

    瀏覽量

    44745
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3885

    瀏覽量

    65647
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    577

    瀏覽量

    25151
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4883

    瀏覽量

    70116
  • rust語言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3101
  • SQLx
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    79
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    SQLx的基礎(chǔ)用法進(jìn)階用法

    SQLx是一個(gè)Rust語言的異步SQL數(shù)據(jù)庫訪問庫,支持多種數(shù)據(jù)庫,包括PostgreSQL、MySQL、SQLite等。本教程將以SQLite為例,介紹SQLx的基礎(chǔ)
    的頭像 發(fā)表于 09-19 14:29 ?2748次閱讀

    SeaORM的基礎(chǔ)用法

    可讀性。 本教程中,我們將介紹SeaORM的基本用法進(jìn)階用法。我們將使用SQLite數(shù)據(jù)庫來演示這些用法。 基礎(chǔ)
    的頭像 發(fā)表于 09-19 14:37 ?2894次閱讀

    Stream模塊的基礎(chǔ)用法進(jìn)階用法

    Rust 語言中,Tokio 是一個(gè)非常流行的異步編程框架。它提供了一系列的模塊,其中最常用的就是 Stream 模塊。Stream 模塊允許我們以異步的方式處理數(shù)據(jù)流,這在很多情況下非常
    的頭像 發(fā)表于 09-19 15:33 ?1449次閱讀

    基于Rust語言Hash特征的基礎(chǔ)用法進(jìn)階用法

    ,包括Hash trait、HashMap、HashSet等,本教程將詳細(xì)介紹Rust語言Hash特征的基礎(chǔ)用法進(jìn)階用法。 基礎(chǔ)
    的頭像 發(fā)表于 09-19 16:02 ?1694次閱讀

    Rust語言如何與 InfluxDB 集成

    的數(shù)據(jù)處理和存儲(chǔ)能力。 本教程將介紹 Rust 語言如何與 InfluxDB 集成,包括基礎(chǔ)用法進(jìn)階用法和完整的示例代碼。 基礎(chǔ)
    的頭像 發(fā)表于 09-30 16:45 ?1377次閱讀

    Rust的 match 語句用法

    執(zhí)行不同的代碼,這在處理復(fù)雜的邏輯時(shí)非常有用。本教程中,我們將深入了解 Rust 的 match 語句,包括基礎(chǔ)用法進(jìn)階用法和實(shí)踐經(jīng)驗(yàn)等
    的頭像 發(fā)表于 09-19 17:08 ?1114次閱讀

    AsyncRead和AsyncWrite 模塊進(jìn)階用法示例

    Rust 語言是一門高性能、安全、并發(fā)的編程語言,越來越受到開發(fā)者的關(guān)注和喜愛。而 Tokio 是 Rust 語言中一個(gè)非常流行的異步運(yùn)行時(shí)
    的頭像 發(fā)表于 09-20 11:41 ?1075次閱讀

    單片機(jī)的C語言中位操作用法

    單片機(jī)的C語言中位操作用法
    發(fā)表于 08-17 15:04

    C語言中atoi()函數(shù)的用法 相關(guān)資料分享

    C語言中atoi()函數(shù)的用法
    發(fā)表于 07-01 08:12

    C語言中的#和##的用法

    和conStr的參數(shù),并且宏conStr和toString中均含有#或者##符號(hào),所以A不能被解引用。導(dǎo)致不符合預(yù)期的情況出現(xiàn)。 3.2 解決方案 結(jié)果: 責(zé)任編輯:xj 原文標(biāo)題:C語言中#和##的用法 文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明
    的頭像 發(fā)表于 12-06 09:34 ?7.7w次閱讀
    C<b class='flag-5'>語言中</b>的#和##的<b class='flag-5'>用法</b>

    C語言中的typedef的用法

    以前的學(xué)習(xí)中對(duì)于C語言中typedef和define的認(rèn)識(shí)是,#define是宏,作用是簡(jiǎn)單的替換,而typedef也是替換,只不過比define高級(jí)的是替換的時(shí)候會(huì)進(jìn)行語法檢查。但是后來
    發(fā)表于 01-13 13:36 ?0次下載
    C<b class='flag-5'>語言中</b>的typedef的<b class='flag-5'>用法</b>

    詳解C語言中特殊用法

    C語言有很多特殊的用法,如果這些特殊用法使用得當(dāng),會(huì)是你的代碼變得更加有健壯,更加容易維護(hù)。
    的頭像 發(fā)表于 07-15 08:57 ?1701次閱讀

    【C語言進(jìn)階】C語言指針的高階用法

    【C語言進(jìn)階】C語言指針的高階用法
    的頭像 發(fā)表于 08-31 13:24 ?2625次閱讀

    基于select!宏的進(jìn)階用法

    宏,它可以讓我們同時(shí)監(jiān)聽多個(gè)異步事件,一旦其中一個(gè)事件觸發(fā),就可以立即執(zhí)行相應(yīng)的代碼。本教程中,我們將詳細(xì)介紹 select!宏的進(jìn)階用法,并提供多個(gè)示例來幫助您更好地理解和掌握這個(gè)宏的使用方法。
    的頭像 發(fā)表于 09-19 15:35 ?922次閱讀

    元組的基礎(chǔ)用法進(jìn)階用法

    元組是 Rust 語言中一種非常有用的數(shù)據(jù)結(jié)構(gòu),它可以將多個(gè)不同類型的值組合在一起。本教程將介紹元組的基礎(chǔ)用法進(jìn)階用法,并結(jié)合示例代碼進(jìn)行
    的頭像 發(fā)表于 09-30 16:49 ?1107次閱讀

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品