Django South — легко меняем модель данных

В начале работы с 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.

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

 

Python/Django

1 comment


  1. dmi

    Как-то эта заметка вышла очень «тугой» по стилю.
    Сам не могу ее читать…
    Буду потихоньку исправлять. :)

    P.S. … вроде бы исправил.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

captcha

Please enter the CAPTCHA text