如何在 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 中查询复杂的 JSONB 字段