Разрабатывал локально проект.
Работа -> миграции -> Работа -> миграции -> ... = Код + Дамп базы.
Выкладываю проект на сервер, а virtualenv на сервере собирается заново через pip и прописанные пакеты из requirements.txt.
Т.е. получается, что все приложения из коробки у меня содержат только начальные миграции, а опубликованная база у меня уже содержит все миграции, которые я применял локально при разработке.
Как жить дальше? Как синхронизировать базу, локальные и серверные миграции?
Информация о примененных миграциях хранится в самой базе данных (таблица django_migrations). Поэтому если скрипты миграций вручную не менялись и не удалялись, то никаких проблем при деплое не возникнет. Более того, дальнейшие изменения структуры БД можно без проблем накатывать с помощью python manage.py migrate - в этом и заключается прелесть миграций.
Значит в базе у меня записаны все примененные локально миграции.
Я беру и просто копирую локальные уже примененные миграции в соответствующие папки на сервер.
Но после запуска showmigrations мне выдается ошибка:
Дмитрий, если у вас сейчас структура БД актуальна (все миграции были применены), а с миграциями творится чёрт знает что, то:
удалите локально все файлы миграций из своих приложений проекта
создайте локально их заново
отправьте код в репу, разверните на боевом сервере, сделайте руками migrate --fake
в дальнейшем, делайте миграции только локально, и каждый раз при деплое делайте migrate. Не надо БД синхронизировать дампами и sql-скриптами, если хотите спокойной разработки
Дмитрий, в сообщении об ошибке всё чёрным по белому написано - файл 0011_auto_20170621_1334 был удалён или переименован.
Исправить ситуацию можно следующим образом:
- выгрузить данные с помощью dumpdata
- удалить имеющиеся файлы миграций
- создать новые файлы миграций с помощью ./manage.py makemigrations
- создать новую базу данных
- применить миграции - ./manage.py migrate
- загрузить данные с помощью loaddata
neatsoft, да в том-то и дело, что он у меня был. Просто я хаотично запускал makemigrations на сервере зачем-то (ну, по глупости). Теперь разобрался и все починил, благодаря Anton Kuzmichev.
И Вам спасибо за ответ!