Как я могу удалить непримененные миграции? - PullRequest
2 голосов
/ 19 сентября 2019

Я хочу удалить только непримененные миграции, 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" и после этого снова сделать makemigrations и migrate?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Да, вы можете просто удалить их из папки миграций (не удаляйте саму папку миграций).

0 голосов
/ 19 сентября 2019

Краткий ответ : Вы можете сделать это, но вы должны быть осторожны и учитывать некоторые ситуации.


Вы можете удалить миграции, которые еще не применены к базе данных.Но вы должны быть очень осторожны с этим, поскольку не сказано, что если миграции не применяются к одной базе данных (например, к базе данных, которую вы используете для разработки), то другие базы данных (например, в рабочей среде) уже не переносятся в дальнейшем.цепочка миграции.

Таким образом, вы должны удалять только те миграции, для которых вы уверены, что ни одна база данных еще не выполнила миграции.Если вы удалили миграции, которые уже были применены.Например, базы данных могут иметь уже созданные таблицы, столбцы и т. Д. Если вы позже запустите новую миграцию, эта миграция будет содержать изменения, начиная с той точки, где вы удалили миграции, и, следовательно, может привести к ошибкам, поскольку эта миграциябудет стремиться создать таблицу, которая уже существует.

Другая потенциальная проблема заключается в том, что миграции могут содержать RunPython операций [Django-doc] .Обычно это небольшие кусочки кода, которые каждый вставил вручную .Например, заменить все записи так, чтобы конкретный столбец теперь имел определенное значение.При удалении этих миграций и новых миграциях эти RunPython операции будут потеряны.Название миграций (оно содержит auto) предполагает, что миграции были созданы автоматически, но не исключено, что программист позже изменил такой файл и таким образом вставил операцию RunPython.

Имеямножественные миграции не являются серьезной проблемой.Django запустит алгоритм топологической сортировки на «графе миграции», и это можно сделать в O (n) .Наличие большого количества файлов обычно не является серьезным узким местом.

Возможно, вы захотите использовать squashmigrations [Django-doc] для группирования миграций вновый файл.Это будет учитывать операции RunPython и, таким образом, может быть более безопасным, чем подавление миграций путем удаления и воссоздания миграций.

0 голосов
/ 19 сентября 2019

Да, если они не применяются к базе данных, вы можете просто удалить их.

...