我真的不懂 一篇水篇 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