运行迁移
1. 命令行操作 (CLI)
在终端里,你可以手动控制数据库的进化。
注意 :运行这些命令前,必须先在终端设置环境变量:
export DATABASE_URL="postgres://user:pass@localhost:5432/db"。
常用命令对比表
| 命令 | 行为 | 危险等级 | 适用场景 |
|---|---|---|---|
up | 运行所有未执行的迁移。 | 🟢 安全 | 日常更新数据库。 |
down | 撤销最后一次迁移。 | 🟡 中等 | 发现刚写的脚本有错,回滚一下。 |
status | 列出哪些已跑,哪些还没跑。 | 🟢 安全 | 检查当前数据库版本。 |
refresh | 先回滚所有迁移,再重新全部跑一遍。 | 🔴 危险 | 相当于重置数据,但保留表结构的变化。 |
fresh | 直接删掉所有表 ,再重新跑一遍。 | 💀 极高 | 数据库搞乱了,想彻底推倒重来。 |
reset | 回滚所有已应用的迁移。 | 🔴 危险 | 清空数据库结构。 |
A. 命令行界面 (CLI) 常用操作
sea-orm-cli migrate init: 初始化迁移目录,生成基础结构, eg:sea-orm-cli migrate init。sea-orm-cli migrate generate [NAME]: 生成带时间戳的新迁移文件, eg:sea-orm-cli migrate generate create_user_table。sea-orm-cli migrate up: 应用所有挂起的(未执行的)迁移任务, eg:sea-orm-cli migrate up。sea-orm-cli migrate up -n [NUM]: 应用指定数量的挂起迁移任务, eg:sea-orm-cli migrate up -n 3。sea-orm-cli migrate down: 撤销最后一次应用的迁移任务, eg:sea-orm-cli migrate down。sea-orm-cli migrate down -n [NUM]: 撤销最近指定数量的迁移任务, eg:sea-orm-cli migrate down -n 2。sea-orm-cli migrate status: 查看所有迁移任务的状态(已应用或挂起), eg:sea-orm-cli migrate status。sea-orm-cli migrate fresh: 删除数据库中的所有表,并重新从头应用所有迁移, eg:sea-orm-cli migrate fresh。sea-orm-cli migrate refresh: 回滚所有已应用的迁移,然后重新应用它们, eg:sea-orm-cli migrate refresh。sea-orm-cli migrate reset: 回滚所有已应用的迁移任务, eg:sea-orm-cli migrate reset。
B. 程序化调用 (在 Rust 代码中运行)
Migrator::up(db, None): 在程序启动时自动应用所有挂起的迁移, eg:Migrator::up(&db, None).await?。Migrator::up(db, Some(n)): 在代码中应用前n个挂起的迁移, eg:Migrator::up(&db, Some(5)).await?。Migrator::down(db, None): 在代码中回滚所有已应用的迁移(等同于 reset), eg:Migrator::down(&db, None).await?。Migrator::down(db, Some(n)): 在代码中回滚最后n个迁移, eg:Migrator::down(&db, Some(1)).await?。Migrator::status(db): 在代码中检查迁移状态, eg:let status = Migrator::status(&db).await?。Migrator::fresh(db): 在代码中执行“删表重练”操作, eg:Migrator::fresh(&db).await?。Migrator::refresh(db): 在代码中执行“重置并重启”迁移, eg:Migrator::refresh(&db).await?。Migrator::reset(db): 在代码中撤销所有迁移, eg:Migrator::reset(&db).await?。Migrator::get_pending_migrations(db): 获取所有尚未应用的迁移列表, eg:let pending = Migrator::get_pending_migrations(&db).await?。Migrator::get_applied_migrations(db): 获取所有已经成功应用的迁移列表, eg:let applied = Migrator::get_applied_migrations(&db).await?。
2. 代码自动执行:生产环境必备
在生产环境,你不可能手动去敲命令行。通常在 main.rs 程序启动时自动检测并升级数据库。
use migration::{Migrator, MigratorTrait};
// 在连接数据库后调用
let db = Database::connect(url).await?;
// 自动把所有没跑的迁移补上
Migrator::up(&db, None).await?;