[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
今天先这样


<<:  [iT铁人赛Day27]练习题(6)

>>:  DAY 15- 《公钥密码》-ECC

[NestJS 带你飞!] DAY25 - Authorization & RBAC

现在的企业会使用一些管理系统来管理人力等资源,而这些管理系统通常都会有所谓的 权限设计 (Permi...

Day 5【JavaScript】可以看到,将近是20公分的深度

【前言】 我的习惯是先在 Youtube 看完落落长的影片,然後才去 Coursera 看看有什麽...

D14-(9/14)-台泥(1101)-全台湾第一号股票

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...

Python 学习笔记_装饰器(decorator) 与重试(retry)

这篇文章主要是在纪录 python decorator 的学习过程, 有错或是更好的写法的话,欢迎留...

26. Redux 的用途 & 入门实作 (下)

这篇来把上一篇跳过的action补上,然後会补充一点之前没讲过的super()和React Refs...