[Day22] Rust 直接使用资料库语法操作资料库 (Part1)



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


<<:  Day 12 - Using List<T> to Store JSON Format Path with ASP.NET Web Forms C# 用强类型物件清单储存 JSON 格式的相簿图片路径

>>:  Android学习笔记17

使用bot.py建立起你的第一个机器人

行前作业 注册帐号 需要有自己的服务器或是相应的权限 开始後续作业 搜寻discord develo...

Day 07:泡沫排序(bubble sort)

如果一个阵列中的任两个元素是有排序的,是不是代表整个阵列就是排序好的? 这就是泡沫排序的想法。 如果...

Day_23 WireGuard

延伸昨天OpenVPN,介绍另一个VPN点对点的连接技术"WireGuard"。...

Day 0x1A UVa10931 Parity

Virtual Judge ZeroJudge 题意 输入整数 I,输出二进位表示法与 parit...

【MusesAI入门】DAY1.注册教学

身为管理者的您是否觉得已经建立详细作业程序,但产品品质却不符合预期? 工厂作业员每天一直在做动作重覆...