Django:恢复合并迁移

问题描述 投票:3回答:1

假设我们使用以下依赖图进行迁移(全部已应用):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_d1而不撤消0006_f0005_e0004_d的方法,除了打开DB shell并手动恢复它。

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

python django database-migration django-migrations
1个回答
0
投票

如果我正确地阅读你的问题,你的情况与我的情况类似,我希望在不触及其他分支的情况下还原一个特定的分支。

我相信我设法通过以下方式执行此操作(第11.11节):

  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分支,然后伪造迁移到它;否则你应该能够删除它。

© www.soinside.com 2019 - 2024. All rights reserved.