假设我们使用以下依赖图进行迁移(全部已应用):Initial state
现在,由于某种原因,我们希望在应用迁移0006_f
后将数据库模式恢复到该状态。我们输入:
./manage.py migrate myapp 0006_f
现在我们有以下状态:One branch reverted
问题是Django没有恢复正确的分支,所以现在我们从左分支应用了一些迁移,而从右分支应用了一些迁移。
避免它的一种方法是迁移回0002_b
并转发到0006_f
,但这可能导致数据丢失。此外,一些迁移0006_f
,0005_e
,0004_d
,0003_c
也是不可逆转的。
另一种方法是运行以下命令:
./manage.py migrate myapp 0006_f
./manage.py migrate myapp 0004_d1
现在,为了达到理想状态,我们只需要恢复迁移0004_d1
,我没有看到撤消0004_d1
而不撤消0006_f
,0005_e
和0004_d
的方法,除了打开DB shell并手动恢复它。
有没有办法明确撤消一次迁移?是否有另一种方法可以正确撤消并行分支的迁移?在撤消合并迁移时,Django是否有某些原因不能自动从并行分支恢复迁移?
如果我正确地阅读你的问题,你的情况与我的情况类似,我希望在不触及其他分支的情况下还原一个特定的分支。
我相信我设法通过以下方式执行此操作(第11.11节):
所以在你的情况下:
./manage.py migrate --fake myapp 0003_c
./manage.py migrate --fake myapp 0005_e1
./manage.py migrate myapp 0003_c
./manage.py migrate --fake myapp 0007_g
如果您的合并迁移0008_merge执行任何实际工作或迁移更多分支,您可能必须手动编辑它以省略0005_e1分支,然后伪造迁移到它;否则你应该能够删除它。