2011-06-07 71 views
4

在开发过程中,我创建了许多迁移,通常来回地讨论我如何实现某些东西。将多个南迁移到一个迁移

现在是时候将它推到生产环境中,但是当重播处女数据库上的所有迁移时我遇到了错误。

我最终做了以下工作。

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

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

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

我该怎么做?如果不可能/建议,那么最佳方法是什么?

回答

4

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

1)这是迄今为止最简单和首选的方法。简单地说,将您的开发数据库回滚到您希望包含在“压扁”中的第一个迁移之前,然后删除其中的所有迁移。最后,重新运行schemamigration管理命令。您将最终在一个文件中完成所有必要的迁移。 2)如果由于某种原因你不能做#1,它在技术上仍然是可能的,但是对程序的要求会更高。将每次迁移的向前和向后方法的内容直接复制并粘贴到一个迁移文件(最低编号的文件)中。这部分很容易,但是您还必须对文件底部的冻结模型进行手动修改。我发现最好的方法是简单地尝试运行这个新的迁移。你很可能会得到关于这样的模型的错误,没有任何属性等等。这是将信息添加到冻结模型的一个信号。当迁移无误地运行时,您是黄金。

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

+2

我自己做了#1。运作良好,但#2听起来很棒。无法想象它比仅仅不压缩它们更好。 – mlissner 2011-07-12 07:02:46

+0

我只是好奇而已。如果我使用#1并为所有现有迁移执行此操作,本质上我将删除并重新创建数据库,然后运行'./manage.py makemigrations'。团队中的其他开发人员是否也需要删除他们的数据库?或者它会无缝工作? – oloo 2014-10-11 16:05:32

0

你试过删除所有迁移,然后做./manage.py schemamigration myapp --init

请记住,这打破依赖于这些迁移的任何东西,所以只有在你还没有生产时才能做到。

1

有一个command in the django manage.py specifically for this。如果您正在使用Migrations作为灯具,如果您不想挤压灯具,则可能需要在某些Migrations中摆弄依赖项属性。

如果没有灯具,只是想壁球从可以运行所有迁移:

python manage.py squashmigrations app_name 0001 

哪里APP_NAME是你的应用程序的名称,0001是要挤出空位迁移。

查看上面链接的文档以获取更多信息。

+4

请注意,这与Django> = 1.7一起使用,并具有内置的迁移系统。这个问题最初是针对南方的。 – 2015-03-25 08:16:29