如何安全移除Django模型字段且不删除旧迁移文件?
这里有几个无需删除旧迁移文件就能解决字段移除后迁移问题的可行方案:
新增抵消型迁移文件
不用修改任何旧迁移,直接创建一个新的迁移文件,专门用于移除那些你已经删掉的字段。当重新执行全量迁移时,旧迁移会先创建这些字段,紧接着新迁移就会把它们移除,最终数据库会保持正确的结构。比如在Django里,直接运行python manage.py makemigrations就能自动生成移除字段的迁移,再执行python manage.py migrate完成操作;Laravel则可以用php artisan make:migration remove_old_fields_from_table手动创建迁移,然后在文件里写Schema::table('table', function (Blueprint $table) { $table->dropColumn('old_field'); });。局部修改旧迁移文件(需团队同步)
如果你能和团队达成一致,可以修改旧迁移里涉及已删除字段的代码——不用删掉整个迁移文件,只把创建或修改这些字段的代码行注释掉或者删除。修改后提交Git,确保所有团队成员同步这个变更,这样大家执行迁移时就不会再创建那些已经被移除的字段了。利用迁移工具的“跳过”功能
多数主流迁移工具都支持标记某个迁移为已执行,跳过实际运行。比如Django可以用python manage.py migrate --fake <app_name> <迁移编号>,把包含已删除字段的旧迁移标记为已执行;Laravel则可以用php artisan migrate:mark <迁移文件名>(不同版本命令可能有差异)。这个方法适合旧迁移已经在生产环境执行过的场景,新环境部署时跳过旧迁移,直接执行后续的迁移即可。用数据库快照作为初始化基准
若团队允许,可以导出当前生产环境的数据库结构快照(SQL文件),把这个快照作为新环境初始化的基准,而不是从头执行所有迁移。新环境直接导入快照,之后只需要执行快照生成之后的迁移文件,彻底避开那些包含已删除字段的旧迁移。
内容的提问来源于stack exchange,提问作者Ilian Gion Häsler

