手动删除迁移文件后如何执行回滚操作?
迁移文件误删后无法回滚的解决方案
问题原因
所有主流框架的迁移工具都会在数据库中维护一张迁移执行记录表(不同框架默认表名不同:Laravel为migrations、Django为django_migrations、Rails为schema_migrations),表中按执行顺序存储了所有已运行的迁移文件名称。
你仅删除了本地的迁移文件,但数据库中对应的执行记录仍然存在。回滚操作默认会从最新的已执行迁移开始倒序匹配本地文件,因此会优先命中你已删除的迁移文件触发报错。--path参数仅限制迁移文件的扫描范围,不会跳过已记录的执行顺序校验,因此无法规避该问题。
报错信息:
migration not found: name_of_the_last_migration_I deleted_manually
解决步骤
分两种场景按需选择:
场景1:不需要保留已删除迁移对应的数据库变更
- 首先在本地迁移文件目录下,创建和报错提示名称完全一致的空迁移文件,后缀和项目内其他迁移文件保持一致
- 在该空迁移的回滚逻辑块(如Laravel的
down()方法、Django的迁移回滚代码块)中补充对应变更的回滚逻辑,记不清具体变更也可暂时留空 - 正常执行回滚命令即可,回滚完成后可直接删除这个临时创建的迁移文件
场景2:需要保留现有所有数据库表结构和数据,不改动线上内容
- 直接连接项目数据库,打开上述的迁移执行记录表
- 找到表中存储的、和你已删除的迁移文件名一致的记录,直接删除这条记录即可
- 此时数据库中记录的最新已执行迁移,会和你本地现存的最新迁移文件自动对齐,后续执行迁移、回滚操作都不会再触发报错
注意事项
- 操作数据库前请提前备份全量数据,避免误操作导致数据丢失
- 后续不要直接手动删除已执行过的迁移文件,如果需要清理旧迁移,要么先执行回滚再删除文件,要么删除文件后同步删除迁移表中对应的执行记录
内容的提问来源于stack exchange,提问作者Dr.Noob
相关产品推荐
相关产品推荐

