iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
Software Development

Rust的多方面運用系列 第 22

[Day22] Rust 直接使用資料庫語法操作資料庫 (Part1)



我真的不懂 一篇水篇 100 多 正常的 20多
是不是搞錯了什麼


總之開始今天的內容吧
那麼今天介紹的是 Rust 的 SQLx 套件
注意這個跟 Diesel 不一樣 不是 ORM
這個套件能夠操作 SQL 的語言
那本篇將會以 SQLite 作為範例
並且使用最常見的幾個操作

環境配置

# Cargo.toml
[dependencies]
sqlx = { version = "0.5.7", features = [ "runtime-tokio-rustls", "sqlite" ] }
tokio = { version = "1.12.0", features = ["full"] }
anyhow = "1.0"
futures = "0.3"

以上是本次的 Cargo.toml
至於我自己弄的時候為了避免麻煩 tokio features 是直接設為 full
大可不必跟我一樣這樣做

那麼接下來是在 terminal 必須要輸入的
Tips: 筆者的系統是 Garuda Linux (Arch 架構)

sudo pacman -S sqlite
cargo install sqlx-cli // 或者也可以 sudo pacman -S sqlx-cli

那上面基本上都是安裝的部份
接下來就是創立資料庫

export DATABASE_URL="sqlite:test.db"
sqlx migrate add <anyname>

按下 enter 後就會創立一個名為 migrations 的資料夾 裡面有一個 sql 的檔案
裡面輸入

CREATE TABLE account (
     name TEXT PRIMARY KEY,
     password TEXT NOT NULL
);

這邊取決於個人想要寫的東西 只要知道說 PRIMARY KEY 代表的是 找尋資料時的關鍵字
就像使用 map 資料結構時的 KEY
接下來


sqlx db create

上面的 test 可以自行更動 主要是建立環境變數
然後下面會創建出 名為 test 的 db 檔
輸入

sqlx migrate run 

來將剛剛所寫的設定套用

那這邊可以看到 已經套用了剛剛所設定的東西在 test.db 上
(此軟體為 SQLitebrowser)
好 OK 環境配置差不多這樣就好了


常見使用

這邊我主要會講 main function 新增 刪除 改變 取值
那麼最重要的首先是 main function

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let pool = SqlitePool::connect(&env::var("DATABASE_URL")?).await?;
    Ok(())
}

這邊的話上面的 use 會是

use sqlx::sqlite::SqlitePool;
use std::env;

那 env::var 是拿來取得環境變數的 owob
然後 如果說 main function 下要使用 async 或是 await
必須要使用 tokio
其實還有另一個 只是我沒用過
至於你會發現說 上面怎麼這麼多 ?
因為他們回傳的都是 Result 所以需要用以前講過的方式來處理

那今天會講 新增的部份 其他的明天再說 休息w

新增

async fn add_account(pool: &SqlitePool, name: String, password: String) -> anyhow::Result<()> {
    let mut conn = pool.acquire().await?;
    let add = sqlx::query!(
        r#"INSERT INTO account (name, password) VALUES ($1, $2)"#, name, password,)
        .execute(&mut conn).await?;
    Ok(())
}

可以看到說這邊他最後的回傳值是 Ok(())
這個用法其實是對應上面所需要的 Result 因為這個函數可能會有 Err 產生
所以一定要回傳 Result 至於為什麼要用 Anyhow 這個我可能要回去研究一下 @@
可以發現說 上面的 add 直接使用了 SQL 的語法
並且對應的值需要以
$num 來對應
上面寫的 num 是指他的順序
也就是他編排的順序而且也不一定一定要是從 $1 開始 也可以 $2 $1 但是一定要是一個連續的數字不然會炸w
去連到我們的 pool 透過剛剛定義的 conn
那麼傳入就

接下來 cargo run 跑起來會發現

已經成功新增


明天會將這個套件講完
有點怕之後打疫苗會斷更 QQ


上一篇
[Day21] 用 WASM 做一個凱薩密碼 加密 / 解密 網站
下一篇
[Day23] Rust 直接使用資料庫語法操作資料庫 (Part2)
系列文
Rust的多方面運用30

尚未有邦友留言

立即登入留言