那今天不说废话了直接开始
延续昨天的 我们已经建立出一个 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
今天先这样
现在的企业会使用一些管理系统来管理人力等资源,而这些管理系统通常都会有所谓的 权限设计 (Permi...
【前言】 我的习惯是先在 Youtube 看完落落长的影片,然後才去 Coursera 看看有什麽...
注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...
这篇文章主要是在纪录 python decorator 的学习过程, 有错或是更好的写法的话,欢迎留...
这篇来把上一篇跳过的action补上,然後会补充一点之前没讲过的super()和React Refs...