В начале работы с Django меня очень впечатлила команда syncdb, которая на основе модели данных создает необходимые таблицы.
К сожалению, любое дальнейшее изменение модели нам предлагается вносить в базу данных вручную, вспоминая SQL-ный синтаксис… А потом нас ждет повторение того же на рабочей базе.
Однако, существуют средства для автоматизации и этого процесса.
Пара моих прежних попыток упростить себе жизнь не увенчалась успехом в силу каких-то бессмысленных обстоятельств. Острое нежелание писать alter table снова вернуло меня к этой теме.
Повыбирав между Evolution, South и менее популярными вариантами я остановился на Django South.
Следует отметить, что в жизни, рано или поздно случаются миграции, с которыми электронный разум справиться не в состоянии. Поэтому в интернете достаточно негативных отзывов о любой утилите — и Django South тут не исключение. Но большинство авторов сходится на том, что South более продвинут.
Меня в первую очередь интетересовали простейшие миграции, которых обычно случается довольно много. Об этом и представляю небольшую шпаргалку.
Установка django-south
Выполните
apt-get install python-django-south
Включите ‘south’ в список INSTALLED_APPS в settings.py Вашего проекта.
Выполните
./manage.py syncdb
Теперь ваш ./manage.py начнет поддерживать ряд новых команд.
Использование
Django South действует не на весь проект, а подключается к отдельным приложениям. Внутри подключенного приложения появляется подкаталог migrations/, в котором хранятся данные об изменениях схемы данных.
Чтобы передать изменения базы данных с девелоперской копии на рабочую, на нее нужно скопировать содержимое migrations/ и использовать новые команды manage.py для повторения изменений.
Все это делается это двумя способами.
Вариант 1: Подключение к новому приложению
Если Вы включили в проект новое приложение и еще не создали для него схему данных при помощи syncdb, то (вместо syncdb) выполните:
$ ./manage.py schemamigration myapp --initial $ ./manage.py migrate myapp
Первая команда создаст «начальную миграцию» (и запишет ее в каталог myapp/migrations). От этой миграции будут отсчитываться все последующие изменения.
Вторая команда применит миграцию к базе данных — аналогично syncdb.
Вариант 2: Подключение к существующему приложению
Если схема данных приложения уже создана ранее с помощью syncdb, то, чтобы отдать ее под управление Django South, надо поступить иначе:
$ ./manage.py convert_to_south myapp
Естественно, на момент запуска этой команды состояние модели и базы данных должны соответствовать!
Команда convert_to_south создаст фиктивную начальную миграцию. Точнее говоря, она создаст реальную миграцию для начального создания схемы, но не будет применять ее к базе данных.
При передаче конфигурации с девелоперской копии на рабочую, на последней нужно будет выполнить
./manage.py migrate myapp 0001 --fake
Опция ‘fake’ предотвратит попытку реального создания таблиц.
Дальнейшее изменение схемы данных (миграция)
После того, как вы измените модель данных, вам понадобится South для миграции схемы. Как и в случае с начальной миграцией, делается это в два приема:
$ ./manage.py schemamigration myapp --auto
Эта команда создаст новый файл вроде myapp/migrations/0002_auto__add_field_…
Затем вы применяете эти изменения:
$ ./manage.py migrate myapp
Для распространения на рабочие базы повторите на них эту команду (после передачи на них всех файлов из myapp/migrations/).
Более сложные случаи
Помимо миграции схемы, Django South сильно упрощает и миграцию данных — когда новое поле данных заполняется на основе других объектов базы данных. Об этом будет следующая заметка, посвященная South.
Чтобы узнать, как задавать начальные значения и пр., начинайте со штатной документации.
Как-то эта заметка вышла очень «тугой» по стилю.
Сам не могу ее читать…
Буду потихоньку исправлять. :)
P.S. … вроде бы исправил.