Django:恢复合并迁移

时间:2017-03-28 19:29:04

标签: python django database-migration django-migrations

假设我们使用以下依赖关系图进行迁移(全部已应用):Initial state

现在,出于某种原因,我们希望在应用迁移0006_f后将数据库架构恢复到该状态。我们输入:

./manage.py migrate myapp 0006_f

现在我们有以下状态:One branch reverted

问题是Django没有恢复正确的分支,所以现在我们从左分支应用了一些迁移,而从右分支应用了一些迁移。

避免这种情况的一种方法是迁移回0002_b并转发到0006_f但这会导致数据丢失。此外,一些迁移​​0006_f0005_e0004_d0003_c可能是不可逆转的。

另一种方法是运行以下内容:

./manage.py migrate myapp 0006_f
./manage.py migrate myapp 0004_d1

现在,要实现所需的状态,我们只需要还原迁移0004_d1,并且在没有撤消0004_d10006_f的情况下,我看不到撤消0005_e的方法0004_d除了打开DB shell并手动还原它。

有没有办法明确撤消一次迁移?是否有另一种方法可以正确撤消并行分支的迁移?在撤消合并迁移时,Django是否有某些原因不能自动从并行分支恢复迁移?

1 个答案:

答案 0 :(得分:0)

如果我正确地阅读了您的问题,那么您遇到的情况与我的相似,我想还原一个特定的分支而不接触其他分支。

我相信我可以通过以下方式(在1.11.7版中)做到这一点:

  1. 首先伪造向共同祖先的反向迁移
  2. 然后伪装到我想还原的分支的迁移
  3. 然后迁移到我以前伪造的迁移至共同祖先
  4. 然后假装迁移到最新版本

所以在您的情况下:

./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分支,然后对其进行假迁移。否则,您应该可以删除它。