Подтвердить что ты не робот

Миграционный конфликт в Django South во время работы в команде

У меня есть короткий вопрос о том, как использовать Django-South во время работы в команде.

Что произойдет, если два человека одновременно создадут файл миграции при внесении изменений в один и тот же файл?

Например, A и B работают с одним и тем же приложением Django. Они работают в разных ветких и оба - при миграции 005. Теперь и A, и B модифицирует apple/models.py и созданный файл миграции с использованием startmigration. Они оба находятся при миграции 006, но имеют совершенно другой файл миграции 006. Я думаю, когда они объединяют свои ветки, может быть некоторая ошибка с Югом.

Есть ли способ обхода этого конфликта? Или Юг достаточно умен, чтобы решить это сам?

4b9b3361

Ответ 1

Юг документация рассказывает об этой проблеме:

Проблема с командами и миграциями возникает, когда более одного человека делает миграцию в одном и том же временном интервале, и оба они совершают без применения другого. Это аналогично двум людям одновременно редактируя один и тот же файл в VCS, и как VCS, South имеет способы решения проблемы.

Если это произойдет, первое, что нужно отметить, это то, что Юг обнаружит проблемы и выпустить такое сообщение:

Inconsistent migration history
The following options are available:
    --merge: will just attempt the migration ignoring any potential dependency
        conflicts.

Если вы перезапустите мигрировать с помощью --merge, Юг просто применит миграции, которые отсутствовали вне очереди. Обычно это работает, как команды работают над отдельными моделями; если это не так, вам нужно посмотрите на фактические изменения миграции и разрешите их вручную, так как вероятно, они будут конфликтовать.

Второе, что нужно отметить, это то, что когда вы тянете кого-то elses изменения модели в комплекте с их собственной миграцией, вам нужно сделать новая пустая миграция, которая имеет изменения из обеих ветвей (если вы использовали меркурий, это эквивалентно фиксация слияния). Для этого просто запустите:

./manage.py schemamigration --empty appname merge_models

(Обратите внимание, что merge_models - это просто имя миграции, измените его для что бы вы ни хотели)

Важное сообщение здесь состоит в том, что Юг не заменяет команду координация - на самом деле, большинство функций существуют исключительно для предупреждения вы, что вы не согласны, и простое слияние на только там для простых случаев. Убедитесь, что ваша команда знает, кто работает на что, поэтому они не записывают миграции, которые затрагивают одни и те же части DB в то же время.