迁移
演进模式
迁移 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。
为什么需要迁移?
迁移是对数据库架构进行的版本化更改,例如添加表或列。迁移可以让架构安全且可重复地演进。
- 在版本控制中进行跟踪
- 按顺序应用,并且恰好应用一次
sqlx-cli 工具
sqlx 提供了用于管理迁移的 CLI。使用 cargo 安装一次即可。
cargo install sqlx-cli --no-default-features --features postgres创建迁移
sqlx migrate add 会在 migrations/ 文件夹中创建带时间戳的 SQL 文件。时间戳决定执行顺序。
sqlx migrate add create_users编写迁移 SQL
每个迁移文件都包含用于推进架构的 SQL。每个文件只保留一个逻辑更改。
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
email TEXT
);运行迁移
sqlx migrate run 会针对 DATABASE_URL 应用所有待处理的迁移,并将每次迁移记录在跟踪表中。
sqlx migrate run跟踪表
sqlx 会将已应用的迁移记录在 _sqlx_migrations 中,保存版本和校验和,因此不会重复应用迁移,也不会静默地修改迁移。
可逆迁移
添加 -r 标志,以分别创建 up 和 down 文件,从而支持回滚。sqlx migrate revert 会运行最近的 down 文件。
sqlx migrate add -r create_posts模拟迁移跟踪
迁移运行器只会应用版本号晚于上次应用版本的迁移。这个可运行示例模拟了这一决策。
fn pending(all: &[u32], applied: u32) -> Vec<u32> {
all.iter().cloned().filter(|v| *v > applied).collect()
}
fn main() {
let migrations = [1, 2, 3, 4];
let last_applied = 2;
println!("{:?}", pending(&migrations, last_applied));
}将迁移嵌入二进制文件
migrate! 宏会将迁移文件夹嵌入二进制文件,使应用能够在启动时应用迁移,无需在生产环境中使用 CLI。
use sqlx::{Pool, Postgres};
async fn migrate(pool: &Pool<Postgres>) {
sqlx::migrate!("./migrations")
.run(pool)
.await
.unwrap();
}校验和与不可变性
切勿编辑已经运行过的迁移。sqlx 会保存校验和,如果过去的迁移内容发生变化,就会拒绝继续执行。请改为添加新的迁移。
幂等 SQL
使用 IF NOT EXISTS 保护语句,这样在全新环境中重新运行时也能安全且可预测。
CREATE TABLE IF NOT EXISTS tags (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);快速检查
检验您对迁移的理解。
回顾
您已经学习了架构迁移:
- 迁移是有顺序、有版本的架构更改
sqlx migrate add/run/revert用于管理迁移- 已应用的版本和校验和保存在
_sqlx_migrations中 migrate!会将迁移嵌入程序,以便在启动时应用- 切勿编辑已应用的迁移;请添加新的迁移
sqlx 课程到此结束。
用 AI 导师学习 Rust — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 39
- 课程
- 144
常见问题解答
「迁移」课时是免费的吗?
是的 — 「迁移」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。
「迁移」这节课中我会学到什么?
演进模式 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn Rust Coding 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「迁移」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn Rust Coding 课中编写并运行代码吗?
能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。