【问题标题】:Squashing multiple South migrations into one migration将多次南方迁移压缩为一次迁移
【发布时间】:2011-06-07 05:02:48
【问题描述】:

在开发过程中,我创建了许多迁移,经常来回讨论我想如何实现某些东西。

现在是时候将其推送到生产环境了,但是当我在原始数据库上重放所有迁移时出现错误。

我最终做了以下事情来让它工作。

python manage.py syncdb --all
python manage.py migrate --fake

但这不会应用我创建的数据迁移。

经过进一步思考,当我准备将其标记为发布版本时,我决定将所有迁移压缩为一个。

我该怎么做?如果不可能/不推荐,那么首选方法是什么?

【问题讨论】:

    标签: django django-south


    【解决方案1】:

    这是可能的,我自己做过几次。你基本上有两种方法:

    1) 这是迄今为止最简单和首选的方法。简单地说,将您的开发数据库回滚到您想要包含在“壁球”中的第一次迁移之前,然后从该迁移中删除所有迁移。最后,重新运行 schemamigration 管理命令。您最终会在一个文件中完成所有必要的迁移。

    2) 如果由于某种原因你不能做#1,它在技术上仍然是可行的,但程序会更加严格。从字面上复制并粘贴每个迁移的前向和后向方法的内容到一个迁移文件(您的最小编号的文件)。这部分很简单,但是您还必须手动修改文件底部的冻结模型。我发现最好的方法是简单地尝试运行这个新的迁移。您可能会收到关于某某模型没有某某属性的错误。这是将该字段添加到冻结模型的信号。当迁移运行没有错误时,你就是黄金。

    注意:请记住,当您删除那些旧的迁移文件时,请记住您正在使用的任何版本控制系统。换句话说,使用git rmsvn rm 等。如果你最终在你的版本中标记了那些旧的迁移,你会破坏你的生产实例。就我而言,在我准备好发布我的更改之前,我从不提交迁移。如果丢失,您可以随时重新生成迁移。

    【讨论】:

    • 我自己完成了#1。效果很好,但#2 听起来很疯狂。无法想象这比一开始就不压扁它们更好。
    • 我只是想知道。如果我选择#1 并为所有现有迁移执行此操作,基本上我会删除并重新创建我的数据库,然后运行./manage.py makemigrations。团队中的其他开发人员是否也需要删除他们的数据库?还是会无缝运行?
    【解决方案2】:

    有一个command in the django manage.py specifically for this。如果您将迁移用作固定装置,如果您不想压缩固定装置,则可能需要在某些迁移中调整依赖项属性。

    如果您没有固定装置并且只是想压缩所有迁移,则可以运行:

    python manage.py squashmigrations app_name 0001
    

    其中 app_name 是您的应用的名称,0001 是您希望压缩到的迁移。

    有关详细信息,请参阅上面链接的文档。

    【讨论】:

    • 请注意,这确实适用于 Django >= 1.7,内置迁移系统。这个问题最初是针对南方的。
    【解决方案3】:

    您是否尝试过删除所有迁移,然后执行./manage.py schemamigration myapp --init

    记住,这破坏任何依赖这些迁移的东西,所以只有在你还没有投入生产时才这样做。

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2014-09-17
      • 2011-06-01
      • 1970-01-01
      • 2016-06-14
      • 2015-11-12
      相关资源
      最近更新 更多