色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    773

    瀏覽量

    44215
  • 數據庫
    +關注

    關注

    7

    文章

    3845

    瀏覽量

    64591
  • 文件
    +關注

    關注

    1

    文章

    570

    瀏覽量

    24799
  • 代碼
    +關注

    關注

    30

    文章

    4823

    瀏覽量

    68894
  • rust語言
    +關注

    關注

    0

    文章

    57

    瀏覽量

    3018
  • SQLx
    +關注

    關注

    0

    文章

    2

    瀏覽量

    46
收藏 人收藏

    評論

    相關推薦

    SQLx的基礎用法進階用法

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

    SeaORM的基礎用法

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

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

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

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

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

    Rust語言如何與 InfluxDB 集成

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

    Rust的 match 語句用法

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

    AsyncRead和AsyncWrite 模塊進階用法示例

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

    單片機的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 ?1505次閱讀

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

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

    基于select!宏的進階用法

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

    元組的基礎用法進階用法

    元組是 Rust 語言中一種非常有用的數據結構,它可以將多個不同類型的值組合在一起。本教程將介紹元組的基礎用法進階用法,并結合示例代碼進行
    的頭像 發表于 09-30 16:49 ?919次閱讀
    主站蜘蛛池模板: 午夜DY888国产精品影院 | 韩剧19禁啪啪无遮挡大尺度 | 日本乱子人伦在线视频 | 暖暖日本 在线 高清 | 午夜DY888国产精品影院 | 大陆老熟女60岁 | 欧美阿v天堂视频在99线 | 背着老婆爆操性感小姨子 | 息与子在线交尾中文字幕 | 疯狂第一次国语 | 国产精品日本欧美一区二区 | av网站视频在线观看 | 小短文H啪纯肉公交车 | 亚洲蜜桃AV永久无码精品放毛片 | 97视频在线免费播放 | 兽皇VIDEO另类HD | 末成年美女黄网站色大片连接 | 日本最新免费区中文 | 野花韩国免费高清电影 | 亚洲麻豆精品成人A在线观看 | 日本吃孕妇奶水免费观看 | 西西人体一级裸片 | 免费看国产精品麻豆 | 欧美 亚洲综合在线一区 | 久久只精品99品免费久 | 国产精品成人影院 | 国产成人精品亚洲线观看 | 最近免费视频中文2019完整版 | 三级黄在线播放 | 在线观看免费亚洲 | 久草在线在线精品观看99 | 亚洲中文字幕乱倫在线 | 日本欧美高清一区二区视频 | 男人吃奶摸下弄进去好爽 | 就去色电影 | 99热久久久无码国产精品性麻豆 | 午夜噜噜噜私人影院在线播放 | 国产精品无码AV天天爽色欲 | 蜜芽资源高清在线观看 | 国产野外无码理论片在线观看 | 无码天堂亚洲国产AV久久 |