Как исправить миграцию

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

Если вы меняли модель данных, ошиблись, но уже успели запустить makemigrations, то ситуация делится на 2 случая: если вы уже запустили migrate с этой миграцией и если вы ещё этого не сделали.

Если ещё не запустили migrate

В таком случае, миграция появилась только как файл в папке migrations/. Найдите файл этой миграции (скорее всего, он будет последним по номеру), и удалите его.

После этого возвращайтесь к переписыванию моделей, как будто ничего небыло. Новый вызов makemigrations создаст новую миграцию взамен старой.

Если вы уже запустили migrate

В таком случае миграция уже попала в базу данных, и извлечь её сложнее. Самый простой и варварский способ — это удалить файл последней миграции, как в предыдущем случае, а потом вдобавок удалить и базу данных (обычно это файл db.sqlite3 в корне проекта).

После этого можно переходить к переписыванию моделей. Повторный запуск migrate создаст новую базу данных, к которой применится уже новая миграция.

Если вы работаете вместе с другими программистами, никогда так не делайте, потому что это вызовет у них большие проблемы: им тоже придётся удалять свои базы данных. Но если вы в проекте один, а в базе данных нет ничего важного — это хороший способ быстро всё исправить.

Если вы дорожите базой данных

Вот неплохой ответ на StackOverflow как отменить миграцию. Там же вы найдёте много других полезных советов. Этот вариант не для новичков, так что аккуратней с ним. Если вы используете тестовую базу данных, в которой нет ничего важного — проще воспользоваться предыдущим советом и удалить базу данных.

Что читать дальше

Если у вас ошибка You are trying to add a non-nullable field without a default, то вот статья как её исправить.


Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.