【问题标题】:Why does schemamigration --auto creates a spurious migration?为什么 schemamigration --auto 会创建虚假迁移?
【发布时间】:2014-01-07 15:53:06
【问题描述】:

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

一个迁移对应于创建一个新模型(我们称之为“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 运行这个虚假迁移,但我认为最终的解决方案是重置从那时起的迁移历史,这很麻烦,因为它在多个环境中被复制。

【问题讨论】:

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


    【解决方案1】:

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

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

    而且,是的,South + 平行分支可能是一种痛苦,但我看不出 South 怎么能更好地完成 ATM 工作。

    【讨论】:

    • 成功了!不幸的是,每当并行生成两个或多个迁移时,我认为就会出现这个问题。猜猜每当南方抱怨时,这将是一个特别注意的问题。谢谢!
    猜你喜欢
    • 2013-06-09
    • 2013-10-08
    • 2014-11-26
    • 2014-12-30
    • 2020-09-25
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多