python - 如何删除未应用的迁移?

标签 python django migrate

我只想删除未应用的迁移,showmigrations 给出:

[X] 0011_auto_20190917_1522
[X] 0012_auto_20190917_1600
[ ] 0013_auto_20190917_1638
[ ] 0014_auto_20190917_1647
[ ] 0015_auto_20190917_1652
[ ] 0016_auto_20190917_1654
[ ] 0017_auto_20190917_1704

...

我有 21 个未应用的迁移!问题是当未应用迁移时,不会对数据库产生任何影响,对吧?我可以只从“myapp”迁移文件夹中删除它们,然后再执行 makemigrationsmigrate 吗?

最佳答案

简短回答:您可以这样做,但您应该小心,并考虑一些情况。


可以删除尚未应用到数据库的迁移。但是您应该非常小心,因为并不是说如果迁移未应用于一个数据库(例如您用于开发的数据库),则其他数据库(例如在生产中)不会进一步迁移迁移链。

因此,您应该只删除您确定没有数据库已经进行过迁移的迁移。如果您删除已经应用的迁移。例如,数据库可能已经构建了表、列等。如果您稍后运行新的迁移,该迁移将包含从您删除迁移的点开始的修改,因此可能会遇到错误,因为该迁移将旨在构建一个已经存在的表。

另一个潜在的问题是迁移可能包含 RunPython operations [Django-doc] .这些通常是您手动插入的一小段代码。例如,替换所有记录,使特定列现在具有特定值。通过删除这些迁移并进行新的迁移,这些 RunPython 操作将会丢失。迁移的名称(它包含 auto)表明迁移是自动构建的,但程序员后来修改此类文件并因此插入 RunPython 并非不可能> 操作。

进行多次迁移并不是一个严重的问题。 Django 将在“迁移图”上运行拓扑排序 算法,这可以在O(n) 内完成。拥有大量文件通常不是严重的瓶颈。

您可能要考虑使用 squashmigrations [Django-doc]将迁移分组到一个新文件中。这将考虑 RunPython 操作,因此可能比通过删除和重新创建迁移来压缩迁移更安全。

关于python - 如何删除未应用的迁移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58006932/

相关文章:

python - 从文件中提取信息

python - 在Django的unittest中更改Client()的默认域

javascript - 通过单击 jQuery 中的 <li> 提交表单

mysql - 将一个远程数据库移动/复制到另一个远程数据库

mysql - Rails mysql2未定义方法 `accept'为nil :NilClass

python - PySpark:当列是列表时向 DataFrame 添加一列

python - 当前文件的路径取决于我如何执行程序

python - Mypy "class module"注解

django - django RedirectView 中的 Success_url

php - 找不到 Linux laravel 迁移驱动程序