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語(yǔ)言中的基礎(chǔ)用法和進(jìn)階用法

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

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

基礎(chǔ)用法

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

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

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

在使用SQLx之前,需要先連接數(shù)據(jù)庫(kù)。SQLx提供了兩種方式連接MySQL數(shù)據(jù)庫(kù):使用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ù)庫(kù)用戶名和密碼,hostname是數(shù)據(jù)庫(kù)主機(jī)名,port是數(shù)據(jù)庫(kù)端口號(hào),database是要連接的數(shù)據(jù)庫(kù)名。

配置文件連接

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

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

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

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查詢語(yǔ)句了。SQLx提供了兩種方式執(zhí)行SQL查詢語(yǔ)句:使用query()方法和使用query_as()方法。

使用query()方法

使用query()方法執(zhí)行SQL查詢語(yǔ)句時(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查詢語(yǔ)句時(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語(yǔ)言中的基礎(chǔ)用法和進(jìn)階用法,包括連接數(shù)據(jù)庫(kù)、查詢數(shù)據(jù)、插入數(shù)據(jù)、更新數(shù)據(jù)、刪除數(shù)據(jù)、事務(wù)和連接池等。SQLx是一個(gè)簡(jiǎn)單易用的異步SQL執(zhí)行庫(kù),可以幫助Rust開發(fā)者快速地與多種數(shù)據(jù)庫(kù)進(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

    文章

    753

    瀏覽量

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

    關(guān)注

    7

    文章

    3752

    瀏覽量

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

    關(guān)注

    1

    文章

    561

    瀏覽量

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

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68231
  • rust語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3001
  • SQLx
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    34
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    SeaORM的基礎(chǔ)用法

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

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

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

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

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

    Rust語(yǔ)言如何與 InfluxDB 集成

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

    Rust的 match 語(yǔ)句用法

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

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

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

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

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

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

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

    C語(yǔ)言中的#和##的用法

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

    C語(yǔ)言中的typedef的用法

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

    詳解C語(yǔ)言中特殊用法

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

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

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

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

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

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

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