Я накопил довольно много миграций, используя South (0.7) и Django (1.1.2), которые начинают занимать довольно много времени в моих модульных тестах. Я хотел бы сбросить базовый уровень и начать новый набор миграций. Я просмотрел южную документацию , выполнил обычный поиск в Google / Stackoverflow (например, «django south (сбросить или удалить или удалить) историю миграции») и не нашел ничего очевидного.
Один из подходов, который я рассмотрел, заключается в том, чтобы «начать заново», удалив «Юг» или «очистить» историю вручную (например, очистить таблицу БД, удалить файлы миграции из директора миграции) и просто запустить заново,
./manage.py schemamigration southtut - начальный
Так что, если кто-то делал это раньше и имеет несколько советов / предложений, они будут очень благодарны.
источник
__init__.py
вappname/migrations
./manage.py makemigrations
но плохие вещи произойдут, если вы не начнете с новой базы данных ...squashmigrations
, что правильный ответОтветы:
Во-первых, ответ южного автора :
Вот что я делаю на своем рабочем сервере dev +, когда мне нужно избавиться от всех этих ненужных миграций разработчиков:
* за исключением случаев, когда вы хотите очистить только одно приложение среди других, в этом случае вам нужно будет отредактировать таблицу south_history и удалить только записи о вашем приложении.
источник
manage.py schemamigration app name --initial
вместо convert_to_south.south.models.MigrationHistory.objects.all().delete()
.manage.py reset south
является опасным и может уничтожить базу данных , если есть какая - либо приложение стороннего использующего юга в проекте, как отметило @thnee ниже. Поскольку в вашем ответе так много откликов, я был бы очень признателен, если бы вы могли отредактировать его и добавить хотя бы предупреждение об этом или (еще лучше) изменить его, чтобы он отражал подход @hobs (что так же удобно, но не влияет на другие приложения) - спасибо!Если вам нужно выборочно (только для одного приложения) сбросить миграцию, которая занимает слишком много времени, это сработало для меня.
Не забудьте вручную восстановить любые зависимости от других приложений, добавив строки, подобные
depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial"))
вашему<app-dir>/migrations/0001_initial.py
файлу, как первый атрибут в вашем классе миграции чуть нижеclass Migration(SchemaMigration):
.Вы можете затем
./manage.py migrate <app-name> --fake --delete-ghost-migrations
в других средах, согласно этому SO ответу . Конечно , если вы поддельные удаления или поддельныеmigrate zero
вам нужно вручную удалять левой более таблиц БД с миграцией , как это .Более ядерный вариант заключается в
./manage.py migrate --fake --delete-ghost-migrations
на сервере развертывания в реальном времени, за которым следует [my] sqldump. Затем направьте этот дамп в [my] sql в тех средах, где вам нужна перенастроенная, полностью заполненная база данных. Южная кощунство, я знаю, но работало на меня.источник
DependsOnUnknownMigration
новую первоначальную миграцию. Благодаря вашему комментарию я смог выяснить, что мне следует обновлятьdepends_on
утверждение везде, где оно относится к этому приложению. Это действительно лучший ответ здесь. Спасибо! :)Благодаря ответам Доминика Гвардиолы и Варвара, это помогло мне решить сложную проблему. Однако есть несколько проблем с решением, вот мое мнение о нем.
Использование
manage.py reset south
это не очень хорошая идея , если у вас есть какие - либо сторонние приложения , которые используют Юг, напримерdjango-cms
( в основном все использует Юг).reset south
удалит всю историю миграции для всех приложений, которые вы установили.Теперь учтите, что вы обновляетесь до последней версии
django-cms
, она будет содержать новые миграции, такие как0009_do_something.py
. Юг, несомненно, будет сбит с толку, когда вы попытаетесь запустить эту миграцию, не пройдя0001
сквозь0008
историю миграции.Намного лучше / безопаснее выборочно сбрасывать только те приложения, которые вы поддерживаете .
Прежде всего, убедитесь, что ваши приложения не имеют рассинхронизации между миграциями на диске и миграциями, которые были выполнены в базе данных. В противном случае будет головная боль.
1. Удалить историю миграции для моих приложений
2. Удалить миграции для моих приложений
3. Создайте новые начальные миграции для моих приложений
4. Поддельные выполнить начальные миграции для моих приложений
Это вставляет миграции в
south_migrationhistory
без касания реальных таблиц:Шаг 3 и 4 на самом деле просто более длинный вариант
manage.py convert_to_south my_app
, но я предпочитаю этот дополнительный контроль в такой сложной ситуации, как изменение производственной базы данных.источник
./manage.py migrate --fake
если вы не хотите фальсифицировать миграцию других приложений, которые ожидают миграции.Как и в случае с ней (см. Ее ответ), мы используем более мягкий подход к предложению автора на юге (Эндрю Годвин), цитируемому в другом месте здесь, и мы отделяем то, что мы делаем с базой кода, от того, что мы делаем с базой данных, во время развертывания потому что нам нужно, чтобы развертывания были повторяемыми:
Что мы делаем в коде:
Что мы делаем с базой данных после развертывания этого кода
источник
Если вы просто работаете на машине разработчика, я написал команду управления, которая в значительной степени выполняет то, что предложил Доминик.
http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html
В отличие от предложения автора на юге, это НЕ ВРЕДИТ другим установленным приложениям, использующим юг.
источник
Следующее только если вы хотите сбросить все приложения. Пожалуйста, сделайте резервную копию всех ваших баз данных до этой работы. Также запишите ваши зависимости в исходных файлах, если таковые имеются.
Однажды:
Протестируйте ваш проект перед загрузкой. Затем для каждого локального / удаленного компьютера примените следующее:
Сделайте начальный (3) для каждого приложения, которое вы хотите повторно привлечь. Обратите внимание, что reset (6) удалит только историю миграции, поэтому не будет вреден для библиотек. Ложные миграции (7) вернут историю миграции любых сторонних установленных приложений.
источник
удалить необходимый файл из папки приложения
путь к экземпляру
вики-мое приложение
источник