RM新时代网站-首页

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

SQLx在Rust語言中的基礎用法和進階用法

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

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

基礎用法

要使用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連接時,需要在代碼中指定連接字符串,例如:

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ù)庫主機名,port是數(shù)據(jù)庫端口號,database是要連接的數(shù)據(jù)庫名。

配置文件連接

使用配置文件連接時,需要在項目根目錄下創(chuàng)建一個名為.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查詢語句時,需要手動指定返回結(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查詢語句時,可以自動將返回結(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ù)時,可以使用execute()方法或execute_with()方法。

使用execute()方法

使用execute()方法插入數(shù)據(jù)時,需要手動指定插入的數(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ù)時,可以使用結(jié)構(gòu)體自動映射的特性,例如:

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ù)時,可以使用execute()方法或execute_with()方法。

使用execute()方法

使用execute()方法更新數(shù)據(jù)時,需要手動指定更新的條件和更新的數(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ù)時,可以使用結(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 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ù)時,可以使用execute()方法或execute_with()方法。

使用execute()方法

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

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ù)時,可以使用結(jié)構(gòu)體自動映射的特性,例如:

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(())
}

進階用法

事務

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

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

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

    關注

    1

    文章

    762

    瀏覽量

    44115
  • 數(shù)據(jù)庫

    關注

    7

    文章

    3794

    瀏覽量

    64359
  • 文件
    +關注

    關注

    1

    文章

    565

    瀏覽量

    24727
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68521
  • rust語言
    +關注

    關注

    0

    文章

    57

    瀏覽量

    3009
  • SQLx
    +關注

    關注

    0

    文章

    2

    瀏覽量

    40
收藏 人收藏

    評論

    相關推薦

    SQLx的基礎用法進階用法

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

    SeaORM的基礎用法

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

    Stream模塊的基礎用法進階用法

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

    基于Rust語言Hash特征的基礎用法進階用法

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

    Rust語言如何與 InfluxDB 集成

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

    Rust的 match 語句用法

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

    AsyncRead和AsyncWrite 模塊進階用法示例

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

    單片機的C語言中位操作用法

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

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

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

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

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

    C語言中的typedef的用法

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

    詳解C語言中特殊用法

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

    【C語言進階】C語言指針的高階用法

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

    基于select!宏的進階用法

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

    元組的基礎用法進階用法

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