Learn Rust Coding · 课时

迁移

演进模式

第 4 / 4 课13 个步骤

迁移 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 连接数据库
  2. 编译期检查查询
  3. CRUD 操作
  4. 迁移
← 返回 Learn Rust Coding