Каков рекомендуемый подход к сбросу истории миграции с помощью Django South?
я накопил довольно много миграций с использованием South (0.7) и Django (1.1.2), которые начинают потреблять довольно много времени в моих модульных тестах. Я хотел бы сбросить базовую линию и начать новый набор миграций. Я просмотрел Южная документации, сделал обычный поиск Google / Stackoverflow (например, "django south (reset OR delete OR remove) migration history") и не нашел ничего очевидного.
один подход, который я рассматривал, будет включать "начать заново", "удалив" юг или" очистив " историю вручную (например, очистить таблицу БД, удалить файлы миграции из директора миграции) и просто повторно запустить,
./manage.py схема миграции southtut -- initial
Итак, если кто-то сделал это раньше, и есть некоторые советы/предложения будут с благодарностью.
7 ответов:
EDIT-я помещаю комментарий ниже в верхней части этого, поскольку важно прочитать его перед > принятым ответом, который следует за @andybak
@ Dominique: ваш совет относительно manage.py сброс на юг опасен и может уничтожить базу данных, если есть какие-либо сторонние приложения, использующие Юг в проекте, как указано @thnee ниже. Поскольку ответ имеет так много upvotes я был бы очень признателен, если бы вы могли редактировать это и добавить хотя бы предупреждение об этом, или (еще лучше) изменить его чтобы отразить подход @плитой (что так же удобно, но не влияет на другие приложения) - спасибо! - chrisv Mar 26 ' 13 at 9: 09
принятый ответ следует ниже:
первый, ответ Южного автора:
пока вы заботитесь о том, чтобы сделать это на всех развертываниях одновременно, не должно быть никаких проблем с этим. Лично я бы делать:
rm -r appname/migrations/ ./manage.py reset south ./manage.py convert_to_south appname(обратите внимание, что "
reset south" часть очищает записи миграции для всех приложений, поэтому убедитесь, что вы либо запускаете две другие строки для всех приложений, либо удаляете выборочно).The
convert_to_southвызов в конце делает новую миграцию и поддельные-применяет его (так как ваша база данных уже имеет соответствующие таблицы). Там нет необходимости, чтобы удалить все таблицы приложений во время процесса.вот что я делаю на моем dev + production server, когда мне нужно чтобы избавиться от всех этих ненужных миграций Дэв:
- убедитесь, что у нас есть одна и та же схема БД с обеих сторон
- удалить все папки миграции с обеих сторон
- run ./manage.py сброс на юг (как говорится в сообщении) с обеих сторон = очищает Южную таблицу *
- run ./manage.py convert_to_south С обеих сторон (подделка миграции 0001)
- затем я могу снова начать делать миграции и нажимать папки миграции мой сервер
* кроме того, если вы хотите очистить только одно приложение среди других, если это так, вам нужно будет отредактировать таблицу south_history и удалить только записи о вашем приложении.
Если вам нужно выборочно (только для одного приложения) сбросить миграции, которые занимают слишком много времени,этой работал для меня.
rm <app-dir>/migrations/* python manage.py schemamigration <app-name> --initial python manage.py migrate <app-name> 0001 --fake --delete-ghost-migrationsНе забудьте вручную восстановить все зависимости на других приложениях, добавляя строки, как
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в других средах, за это так ответ. Конечно, если вы подделываете удаление или подделатьmigrate zeroвам нужно будет вручную удалить все оставшиеся таблицы БД с помощью миграции, например этой.более ядерный вариант
./manage.py migrate --fake --delete-ghost-migrationsна сервере реального развертывания, за которым следует [my]sqldump. Затем передайте этот дамп в [my]sql в средах, где вам нужна перенесенная, полностью заполненная БД. Южное святотатство, я знаю, но работало на меня.
благодаря ответам Доминика Гвардиолы и hobs, это помогло мне решить трудную проблему. Однако есть несколько проблем с решением, вот мой взгляд на это.
используя
manage.py reset southи не очень хорошая идея если у вас есть какие-либо сторонние приложения который использует юг, напримерdjango-cms(в основном все используют на юге).
reset southудалит всю историю миграции для всех установленных приложений.теперь считайте, что вы обновляетесь до последней версии
django-cms, он будет содержать новые миграции, такие как0009_do_something.py. Юг, безусловно, будет смущен, когда вы попытаетесь запустить эту миграцию, не имея0001через0008в истории миграции.гораздо лучше/безопаснее выборочно сбрасывать только те приложения, которые вы поддерживаете.
прежде всего, убедитесь, что ваши приложения не имеют никакой десинхронизации между миграциями на диске и миграциями которые были выполнены в базе данных. Иначе будет головная боль.
1. Удалить историю миграции для моих приложений
sql> delete from south_migrationhistory where app_name = 'my_app';2. Удалить миграции для моих приложений
$ rm -rf my_app/migrations/3. Создание новых начальных миграций для моих приложений
$ ./manage.py schemamigration --initial my_app4. Поддельные выполнить начальные миграции для моих приложений
это вставляет миграции в
south_migrationhistoryне касаясь фактических таблиц:$ ./manage.py migrate --fake my_appШаг 3 и 4 на самом деле просто более длинный вариант
manage.py convert_to_south my_app, но я предпочитаю этот дополнительный контроль, в такой деликатной ситуации, как изменение производственной базы данных.
Как и thnee (см. Ее ответ), мы используем более мягкий подход к предложению Южного автора (Эндрю Годвина), приведенному в другом месте здесь, и мы отделяем то, что мы делаем с базой кода, от того, что мы делаем с базой данных во время развертывания, потому что нам нужно, чтобы развертывания были повторяемыми:
что мы делаем в коде:
# Remove all the migrations from the app $ rm -fR appname/migrations # Make the first migration (don't touch the database) $ ./manage.py schemamigration appname --initialчто мы делаем с базой данных после развертывания этого кода
# Fake the migration history, wiping out the rest $ ./manage.py migrate appname --fake --delete-ghost-migrations
Если вы просто работаете на машине dev, я написал команду управления, которая делает в значительной степени то, что предложил Доминик.
http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html
в отличие от предложения south author, это не повредит другим установленным приложениям, использующим south.
ниже только если вы хотите восстановить все приложения. Пожалуйста, сделайте резервную копию всех баз данных до этой работы. Также запишите ваш depends_on в исходных файлах, если таковые имеются.
на этот раз:
(1) find . -type d -name migrations -exec git rm -rf '{}' \; (2) find . -type d -name migrations -exec rm -rf '{}' \; (3) ./manage.py schemamigration <APP_NAME> --initial (4) [GIT COMMIT]Проверьте загрузку вашего проекта перед нажатием. Затем для каждой локальной/удаленной машины примените следующее:
(5) [GIT PULL] (6) ./manage.py reset south (7) ./manage.py migrate --fakeDo initial (3) for каждое приложение вы хотите повторно вовлечь. Обратите внимание, что reset (6) удалит только миграцию история, поэтому не вредна для библиотек. Поддельные миграции (7) вернут историю миграции любых установленных сторонних приложений.
удалить необходимый файл из папки приложения
путь к экземпляру
cd /usr/local/lib/python2.7/dist-packages/wiki/south_migrationswiki-это мое приложение
Comments