Сокращение множественных южных миграций в одну миграцию - PullRequest
4 голосов
/ 07 июня 2011

Во время разработки я создал много миграций, часто возвращаясь к тому, как я хотел реализовать что-то.

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

В итоге я сделал следующее, чтобы заставить ее работать.

python manage.py syncdb --all
python manage.py migrate --fake

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

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

Как я могу это сделать?Если это невозможно / рекомендуется, то какой метод предпочтительнее?

Ответы [ 3 ]

4 голосов
/ 08 июня 2011

Это возможно, и я сам делал это несколько раз. У вас есть два метода:

1) Это самый простой и предпочтительный метод. Просто откатите вашу базу данных разработчиков до первой миграции, которую вы хотите включить в «сквош», затем удалите все миграции с этой. Наконец, повторно запустите команду управления схемами миграции. Вы получите все необходимые миграции в одном файле.

2) Если по какой-то причине вы не можете сделать № 1, это все еще технически возможно, но будет гораздо более требовательным к процедуре. Буквально скопируйте и вставьте содержимое прямого и обратного методов каждой миграции в один файл миграции (ваш файл с наименьшим номером). Эта часть достаточно проста, но вам также придется вручную вносить изменения в замороженные модели в нижней части файла. Я обнаружил, что лучший способ - просто попытаться запустить эту новую миграцию. Скорее всего, вы получите ошибки о том, что такая-то модель не имеет таких-то атрибутов. Это сигнал для добавления этого поля в замороженную модель. Когда миграция проходит без ошибок, вы золотой.

Примечание. Помните, что при удалении этих старых файлов миграции удаляйте их, используя любую систему управления версиями, которую вы используете. Другими словами, используйте git rm или svn rm и т. Д. Если вы столкнетесь с этими старыми миграциями, помеченными в вашем выпуске, вы заблокируете свой производственный экземпляр. Со своей стороны, я никогда не совершаю миграцию, пока не буду готов отпустить свои изменения. Вы всегда можете восстановить миграцию, если потеряете ее.

1 голос
/ 19 марта 2015

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

Если у вас нет приборов и вы просто хотите раздавить всеМиграции от вас можно запустить:

python manage.py squashmigrations app_name 0001

Где app_name - это имя вашего приложения, а 0001 - миграция, до которой вы хотите выполнить сжатие.

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

0 голосов
/ 08 августа 2012

Вы пытались удалить все миграции, затем выполните ./manage.py schemamigration myapp --init?

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

...