我正在开发Django应用,遇到了一个奇怪的问题,涉及并行进行的2 South的迁移。
一种迁移对应于创建新模型(我们将其称为“ 0001_add_model”),第二种迁移对应于向现有模型中添加字段(我们将其称为“ 0001_add_new_field_to_model”)。现在,这2个迁移是在2个不同的分支中并行进行的(我不再赘述)。当我奔跑时./manage.py migrate
,south告诉我这是一个问题,--merge
无论如何我都可以运行命令来运行迁移。考虑到这两个动作涉及不同的模型,我虽然这样做应该没有问题,所以我做到了,一切顺利。
./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”中添加的字段。在这两种情况下,生成的新迁移显然都不适用,因为这些更改已存在于数据库中。
让我感到困惑的是为什么它会产生这种迁移。South的自动检测器如何工作以创建新的迁移?
为了继续进行开发,我要做的是使用进行这种虚假迁移--fake
,但是我认为最终的解决方案是自那时以来重置迁移历史记录,这很麻烦,因为它已在多个环境中进行了复制。
问题来自“冻结”模型状态,前两次迁移之间状态不一致。如果查看迁移文件,您会看到Migration
该类具有一个models
属性,该属性是生成迁移时模型的“冻结”表示。然后,South使用此表示形式(最后一个应用的迁移文件中的那个表示形式)来检测更改并生成新的迁移。由于您的两个“ 0001_XXX”迁移具有不同的“冻结”模型,因此将针对模型的错误表示生成任何新迁移。
解决方案显然是models
手动修复“ 0001_XXX”迁移。
而且,是的,南端+并行分支机构可能会让人感到痛苦,但我无法看到南端无论如何如何可以更好地完成ATM。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句