2009-09-18 1 views
10

Я хочу использовать юг в моем Джанго проекте как инструмент миграции, но у меня есть проблема с использованием югом многопользовательского сценария:django и юг миграции с конфликтами (0007_two ... и 0007_one) как решить?

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

  • на первом ПК: 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 будет работать отлично.

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

ответ

16

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

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

Этот вопрос следует упомянуть в this section of the South docs; Я подал an issue for it. (Обновление: теперь оно есть.)