如何删除未应用的迁移?

How can I delete unapplied migrations?

我只想删除未应用的迁移,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 吗?

是的,如果它们没有应用到数据库中,您可以简单地删除它们。

是的,您可以从迁移文件夹中删除它们(不要删除迁移文件夹本身)。

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


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

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

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

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

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