iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Software Development

Rust的多方面運用系列 第 23

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

那今天不說廢話了直接開始
延續昨天的 我們已經建立出一個 main function 和 新增的 function 了
還有一個 .db 檔

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

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

    add_account(&pool, a.to_string(), b.to_string()).await?;
    Ok(())
}

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

昨天的 code 應該要有這些
那麼今天要講的就是 取值 刪除 改動

刪除

講完新增 當然是接刪除
而刪除的形式跟新增幾乎一模一樣
除了上面的 SQL 指令以外

async fn remove_user(pool: &SqlitePool, name: String, password: String) -> anyhow::Result<()> {
    let mut conn = pool.acquire().await?;
    let remove = sqlx::query!(r#"DELETE FROM account WHERE name = ($1)"#, name)
        .execute(&mut conn).await?;
    Ok(())
}

這邊 可以看到說跟昨天的新增差不多
所以不另外說
SQL 的刪除語法大概就是
DELETE FROM <Table 名稱> WHERE <primary key 的代號> = <你要搜尋的值的primary key 值>

取值

那這邊的範例是將他的東西直接做成一個檢測密碼的 code (Code 是我自己寫的 owob)

async fn check_password(pool: &SqlitePool, name: String, input: String) -> anyhow::Result<bool> {
    let mut conn = pool.acquire().await?;
    let chk_string = sqlx::query!(
        r#"
        SELECT * FROM account WHERE name = ?1;
        "#, name)
        .fetch_one(&mut conn).await?.password;

    if input == name {
        return Ok(true);
    }
    else{
        return Ok(false);
    }
}

那麼這邊可以看到說後面的 await 接了一個 password
如果說在新增過後去搜尋
他會回傳一個 Record 型態的值

這邊可以看到
我原本想說是利用 spilt 的形式去給他切割
但是他其實是一個 Struct 的結構
所以可以直接進行取值
取值過後他會回傳字串

P.S

這邊多講一個取全部值的方法

async fn list_todos(pool: &SqlitePool) -> anyhow::Result<()> {
    let recs = sqlx::query!(
        r#"
        SELECT *
        FROM account
        ORDER BY username
        "#
    )
    .fetch_all(pool)
    .await?;    
}

至於輸出

for i in recs {
    print!{"{:?}", i};
}

更動

終於來到最後要講的用法了
這個研究超久

async fn change_password(pool: &SqlitePool, name: String, new_password: String) -> anyhow::Result<()>{
    let mut conn = pool.acquire().await?;
    let chk_string = sqlx::query(
        "UPDATE account SET password = $1 WHERE name = $2 returning *")
        .bind(new_password)
        .bind(name)
        .execute(&mut conn)
        .await?;
    Ok(())
}

那麼可以看到 這邊我用了 SQLx 提供的另一種呼叫方式
使用 query()
然後後面的項用 bind 來輸入
要記得 一樣是照順序
那上面 SQL 語法應該就不用多解釋了 owob
今天先這樣


上一篇
[Day22] Rust 直接使用資料庫語法操作資料庫 (Part1)
下一篇
[Day24] Rocket Web 框架 (Part 1)
系列文
Rust的多方面運用30

尚未有邦友留言

立即登入留言