SOUTH. Работа с миграциями

Пятница, 28 Фев. 2014 by Kirill Shershen


В предыдущем посте писал о развертывании базы на боевом сервере, что достаточно одной команды:

python manage.py migrate myapp.

В большинстве случаев это так, но может получится что миграция применилась, но ничего не создалось(например если использовался ключ --fake). Тогда нужно быть готовым проанализировать и исправить ошибки. Для этого нужно знать инструменты south. Они описаны в документации тут.

South хранит все миграции в таблице. Так же они хранятся в виде файлов изменений в папке migrations вашего приложения. 

Если мы добавили миграцию в виде файла, то выполняем команду python migrate.py myapp и в случае успеха создается запись в таблице. Командой python manage.py migrate --list можно посмотреть какие миграции есть вообще и какие из них применены.

Далее команды migrate работают с записями в базе, попутно проверяя наличие файлов в папке migrations. Схема вроде надежная но может получится так что миграция применится, а таблица для модели в базе данных не создастся. Тогда все следующие миграции будут применятся из расчёта что таблица существует и будут падать с ошибкой. В данном случае нужно удалить из базы запись с примененной миграцией. К сожалению стандартных механизмов для этого нет, но есть как минимум 2 способа это сделать:

  1. Добавление в админку таблицы south
  2. Удаление миграции с помощью ключа --delete-ghost-migrations

В первом способе добавляем в admin.py

from south.models import MigrationHistory
admin.site.register(MigrationHistory)

В админке появится таблица которую можно редактировать. Но если упавшая миграция мешает работе django, то надо сначало убрать приложение из INSTALLED_APPS, чтобы не возникало ошибок.

Во втором случае нужно удалить физически файл последней принятой миграции(например 0001_название) и выполнить команду:

python manage.py migrate --delete-ghost-migrations

При этом удалится запись из базы соответствующая неправильно принятой миграции. Далее нужно восстановить файл и останется принять эту миграцию и все последующие заново.

python manage.py migrate myapp

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

Теги: django , south


blog comments powered by Disqus