精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

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

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

基礎用法

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

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

連接數據庫

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

配置文件連接

使用配置文件連接時,需要在項目根目錄下創建一個名為.env的文件,并在其中指定連接信息,例如:

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

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

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

查詢數據

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

使用query()方法

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

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()方法執行SQL查詢語句時,可以自動將返回結果轉換為指定類型的結構體,例如:

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

插入數據

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

使用execute()方法

使用execute()方法插入數據時,需要手動指定插入的數據,例如:

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()方法插入數據時,可以使用結構體自動映射的特性,例如:

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

更新數據

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

使用execute()方法

使用execute()方法更新數據時,需要手動指定更新的條件和更新的數據,例如:

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()方法更新數據時,可以使用結構體自動映射的特性,例如:

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

刪除數據

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

使用execute()方法

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

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()方法刪除數據時,可以使用結構體自動映射的特性,例如:

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執行事務時,可以使用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()方法創建連接池,并使用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(())
}

總結

本教程介紹了SQLx在Rust語言中的基礎用法和進階用法,包括連接數據庫、查詢數據、插入數據、更新數據、刪除數據、事務和連接池等。SQLx是一個簡單易用的異步SQL執行庫,可以幫助Rust開發者快速地與多種數據庫進行交互。

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

    關注

    1

    文章

    759

    瀏覽量

    44069
  • 數據庫
    +關注

    關注

    7

    文章

    3763

    瀏覽量

    64274
  • 文件
    +關注

    關注

    1

    文章

    561

    瀏覽量

    24695
  • 代碼
    +關注

    關注

    30

    文章

    4744

    瀏覽量

    68345
  • rust語言
    +關注

    關注

    0

    文章

    57

    瀏覽量

    3006
  • SQLx
    +關注

    關注

    0

    文章

    2

    瀏覽量

    34
收藏 人收藏

    評論

    相關推薦

    SQLx的基礎用法進階用法

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

    SeaORM的基礎用法

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

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

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

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

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

    Rust語言如何與 InfluxDB 集成

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

    Rust的 match 語句用法

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

    AsyncRead和AsyncWrite 模塊進階用法示例

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

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

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

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

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

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

    和conStr的參數,并且宏conStr和toString中均含有#或者##符號,所以A不能被解引用。導致不符合預期的情況出現。 3.2 解決方案 結果: 責任編輯:xj 原文標題:C語言中#和##的用法 文章出處:【微信公眾號:嵌入式ARM】歡迎添加關注!文章轉載請注明
    的頭像 發表于 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高級的是替換的時候會進行語法檢查。但是后來
    發表于 01-13 13:36 ?0次下載
    C<b class='flag-5'>語言中</b>的typedef的<b class='flag-5'>用法</b>

    詳解C語言中特殊用法

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

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

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

    基于select!宏的進階用法

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

    元組的基礎用法進階用法

    元組是 Rust 語言中一種非常有用的數據結構,它可以將多個不同類型的值組合在一起。本教程將介紹元組的基礎用法進階用法,并結合示例代碼進行
    的頭像 發表于 09-30 16:49 ?847次閱讀