Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

运行迁移

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?;