为什么schemamigration --auto会创建虚假迁移?

时间:2014-01-07 15:53:07

标签: python django parallel-processing migration django-south

我正在开发一个Django应用程序,我遇到了一个关于2个南方并行迁移的奇怪问题。

一次迁移对应于新模型的创建(我们称之为'0001_add_model'),第二次迁移对应于向现有模型添加字段(我们称之为'0001_add_new_field_to_model')。现在,这两次迁移是在两个不同的分支中并行进行的(我不会再犯一个错误)。当我运行./manage.py migrate时,南告诉我存在问题,并且我可以使用--merge运行命令来运行迁移。鉴于这2个动作涉及不同的模型这一事实,我虽然应该没有问题,所以我做了,一切都正常。

当我从那时开始./manage.py schemamigration --auto时出现了问题,它产生了一个与'add_model'完全相同的迁移,除了'add_field_to_model'中添加的字段。它看起来像这样:

( * ) 0001_auto__add_model

( * ) 0001_auto__add_new_field_to_model

-> ( ) 0002_auto__add_model

如果我以相反的方式执行此操作,则会生成相反的操作,即迁移以添加“add_field_to_model”中添加的字段。在这两种情况下,生成的新迁移显然都不适用,因为这些更改已存在于数据库中。

令我困惑的是它为什么会产生这样的迁移。南方的自动检测器如何工作以创建新的迁移?

我为了继续开发而做的是使用--fake运行这种虚假迁移,但我认为最终的解决方案是重置迁移历史记录,这很麻烦,因为它在几个中被复制的环境中。

1 个答案:

答案 0 :(得分:1)

问题来自于“冻结”模型表明前两次迁移之间不一致。如果查看迁移文件,您会看到Migration类具有models属性,这是生成迁移时模型的“冻结”表示。然后,South使用此表示(最后一个应用的迁移文件中的表示)来检测更改并生成新的迁移。由于您的两个“0001_XXX”迁移具有不同的“冻结”模型,因此将针对模型的错误表示生成任何新迁移。

显然,解决方案是手动修复“0001_XXX”迁移的models

而且,是的,South +并行分支可能是一种痛苦,但我无法看到South无论如何都可以做得更好。