Django迁移回滚疑问:操作是否会按照逆序执行?
Django迁移回滚操作顺序说明
核心结论
Django回滚迁移时会严格按照操作定义的逆序执行,你示例中的RunPython操作确实会最后执行回滚逻辑。
执行顺序对比
你给出的迁移操作列表如下:
operations = [ migrations.RunPython(migrate_forward, reverse_code=migrate_backward), migrations.AlterField(...), migrations.AddField(...), ]
正向应用迁移顺序
按列表定义顺序从上到下依次执行:
- 第一步:执行
RunPython的migrate_forward自定义逻辑 - 第二步:执行
AlterField修改目标字段属性 - 第三步:执行
AddField新增指定字段
反向回滚迁移顺序
按列表定义顺序从下到上逆序执行:
- 第一步:回滚
AddField操作,删除之前新增的字段 - 第二步:回滚
AlterField操作,将目标字段恢复到修改前的原有属性 - 第三步:最后执行
RunPython配置的reverse_code,也就是自定义的migrate_backward回滚逻辑
注意事项
- 该逆序执行是Django迁移的内置规则,设计初衷是避免回滚时出现结构依赖错误:后执行的修改先撤销,保证回滚前序操作时,依赖的表结构和操作执行时的状态一致。
- 如果你没有为
RunPython配置reverse_code参数,Django会判定该迁移为不可回滚,执行回滚操作时会直接抛出异常。
内容的提问来源于stack exchange,提问作者Benjamin Hao
相关产品推荐
相关产品推荐

