将多个南迁移纳入一次迁移

时间:2011-06-07 05:02:49

标签: django django-south

在开发过程中,我创建了许多迁移,经常来回寻找我想要实现的东西。

现在是时候将它推向生产,但是在重放原始数据库上的所有迁移时我遇到了错误。

我最终做了以下工作以使其发挥作用。

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

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

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

python manage.py squashmigrations app_name 0001

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

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

答案 2 :(得分:0)

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

请记住,此打破任何依赖于这些迁移的内容,因此只有在您尚未投入生产时才会这样做。