Django и юг миграции с конфликтами (0007_two... и 0007_one), как решить?

Я хочу использовать юг в своем проекте django в качестве инструмента миграции, но у меня проблема с использованием юга в многопользовательском сценарии:

Два разработчика, работающие одновременно на разных машинах, создают две миграции с одинаковым числом

  • на первом ПК: 0007_extend_lizard.py

  • на втором ПК: 0007_swap_name_adopter.py

В этом случае я могу запустить ./manage migrate --merge или ./manage migrate 0006 (откат) и запустить снова ./manage migrate. НО, когда я хочу добавить новое поле в models.py и запустив ./manage startmigration southdemo --auto, юг получит метаданные models = {} от последней миграции, и у нее не было информации из первой миграции. Результатом этого является создание миграции 0008 с созданием снова (!!!) изменений с первого 0007.

Какой лучший способ решить эту проблему?

В настоящее время я думаю о двух вариантах:

  • Вручную объединить миграцию 0007 в один файл и затем выполнить миграцию (но кто-то должен выполнить "откат" )

  • Вручную переместите недостающую models = {} meta для последней миграции 0007, а затем следующий --auto в 0008 будет работать отлично.

Какой лучший вариант? Или есть что-то еще, что мне не хватает?

Ответ 1

После выполнения migrate --merge или rollback-and-migrate, если вы знаете, что в самой последней миграции теперь есть неточные замороженные модели, я бы просто создал новую миграцию без операции для целей доведения замороженных моделей до Дата. Просто запустите ./manage.py startmigration myapp --empty freeze_noop. Теперь ваши замороженные модели будут обновлены в следующий раз, когда вы захотите автоматически определить реальную миграцию.

Может показаться немного уродливым создать перенос no-op, но для меня это кажется более чистым, чем любой из предложенных вручную вариантов редактирования истории. Вы можете думать о миграции no-op как эквивалент "слияния" в DVCS.

Этот вопрос следует упомянуть в в этом разделе южных документов; Я зарегистрировал проблему для него. (Обновление: теперь оно есть.)