那今天不說廢話了直接開始
延續昨天的 我們已經建立出一個 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 的結構
所以可以直接進行取值
取值過後他會回傳字串
這邊多講一個取全部值的方法
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
今天先這樣