如何在 django 1.9+ 中合并连续的数据库迁移?

Posted

技术标签:

【中文标题】如何在 django 1.9+ 中合并连续的数据库迁移?【英文标题】:How to merge consecutive database migrations in django 1.9+? 【发布时间】:2016-07-31 00:54:51 【问题描述】:

迁移允许从一种数据库模式转换到另一种模式,同时保持数据库中的当前数据。 Django 允许使用命令 python manage.py makemigrations

创建迁移

每次运行makemigrations 时,都会根据models.py 文件中检测到的更改添加一个新的迁移文件000n..

有时在对 models.py 进行小幅更改后,我想运行 makemigrations 但不希望创建新的迁移,因为之前的迁移尚未使用,这允许它们合并在一起,主要是因为运行每个当数据库中有大量数据时,生产中的迁移可能会花费大量时间,因此最好提前合并迁移。

有没有办法让新迁移 000n.. 与现有迁移 000(n-1).. 合并?

【问题讨论】:

【参考方案1】:

您要查找的命令是squashmigrations。它将给定应用程序的所有未应用迁移合并到一个文件中。

【讨论】:

壁球用例 - 我做了一个模型更改,并且本地迁移很顺利。在另一个服务器/环境上,它抛出了一个错误。我进行了第二次模型更改(以修复错误),并且在本地应用时很好。在另一个环境中,我无法应用修复(第二次迁移),因为第一个永远不会通过。如果我能把它们结合起来,那就成功了【参考方案2】:

我想运行 makemigrations 但不希望进行新的迁移 由于之前的迁移尚未使用而创建

这不是问题,Django 从上到下运行迁移,意思是:你最新的迁移文件将等到其他以前的迁移文件运行。

因为在生产环境中运行每个迁移可能需要很长时间 当数据库中有大量数据时

数据库中有多少数据?如果真的很多,那么您必须已经有复制和冗余数据库服务器。在这种情况下,将读取和写入切换到一个,比如从服务器,在主服务器中运行迁移。然后将流量切换回master,在此之前确保它们之间的延迟为0并且新模式在它们之间正确复制

【讨论】:

我没有很好地提出这个问题(现在改写了)。我知道迁移是按顺序应用的。我想说的是,如果尚未应用 2 个迁移,那么在手之前将它们合并在一起然后应用它们可能会有一些优势,而不是一个接一个地运行它们。这个答案的第二部分很有趣!

以上是关于如何在 django 1.9+ 中合并连续的数据库迁移?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 1.9 中传递可调用对象

如何在 Django 1.9 中查询复杂的 JSONB 字段

如何在 django 1.9 中删除 django-admin 中的保存并继续编辑按钮,使其不存在?

Django 1.9 在迁移中删除外键

Django 1.9 在列表中查找属性等于某个值的对象

如何在 Django 1.9 中表达 sqlite LEFT OUTER JOIN?