假设我们使用以下依赖关系图进行迁移(全部已应用):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是否有某些原因不能自动从并行分支恢复迁移?
答案 0 :(得分:0)
如果我正确地阅读了您的问题,那么您遇到的情况与我的相似,我想还原一个特定的分支而不接触其他分支。
我相信我可以通过以下方式(在1.11.7版中)做到这一点:
所以在您的情况下:
./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分支,然后对其进行假迁移。否则,您应该可以删除它。