Django 1.8: создание начальных миграций для существующей схемы
я запустил проект django 1.8, который использует систему миграции.
Каким-то образом по пути все стало запутанным, поэтому я удалил папки миграции и таблицу из БД, и теперь я пытаюсь восстановить их, без успеха.
у меня есть три приложения (3 models.py файлы), и модели точно отражают таблицы!
лучший подход, который я нашел до сих пор было:
- удалить все
migrationsпапки. Готово! - удалить все от
django_migrationsтаблица. Готово! - выполнить
python manage.py makemigrations --empty <app>для каждого приложения. Готово! - выполнить
python manage.py migrate --fake. Готово! (хотя это работает только если я запускаю его после каждого .
теперь я добавляю новое поле, запускаю makemigrations команда, и я получаю следующее сообщение об ошибке:django.db.utils.OperationalError: (1054, "Unknown column 'accounts_plan.max_item_size' in 'field list'")
Я горю часами на этой штуке. Как h* * l я могу инициализировать миграции, чтобы я мог продолжать работать без перебои с миграцией каждый раз?
почему это так сложно? Почему нет простого однострочного:initiate_migrations_from_schema?
EDIT:
Теперь все становится еще гаже. Я усек django_migrations таблица и удалил все migrations папка.
Теперь я пытаюсь бежать python manage.py migrate --fake-initial (что-то я нашел в dev docs), просто так он настраивает все "внутренние" приложения Django (auth, session и т. д.), И я получаю:(1054, "Unknown column 'name' in 'django_content_type'").
Теперь этот "столбец" не является реальным столбцом. Это @property определена в приложение. ЧТО ЗДЕСЬ ПРОИСХОДИТ? Почему он идентифицирует name свойство как реальный столбец?
6 ответов:
наконец, получил его на работу, хотя я не знаю, почему и я надеюсь, что это будет работать в будущем.
После проведения многочисленных испытаний и прохождения через сайт разработчика Django (ссылке).
Вот шаги (для тех, кто сталкивается с этой проблемой):
- пустой
django_migrationsстол:delete from django_migrations;- для каждого приложения, удалить его :
rm -rf <app>/migrations/- сброс миграции для "встроенных" приложений:
python manage.py migrate --fake- для каждый запуск приложения:
python manage.py makemigrations <app>. Позаботьтесь о зависимостях (модели с ForeignKey должны работать после их родительской модели).- и наконец:
python manage.py migrate --fake-initialпосле этого я выполнил последнюю команду без
--fake-initialфлаг, просто чтобы убедиться.теперь все работает и я могу использовать, обычно система миграций.
Я уверен, я не единственный, кто сталкивается с этой проблемой. Это должно быть задокументировано лучше и даже упрощенный.
обновление для пользователей Django 1.9:
У меня был этот сценарий снова с Django 1.9.4, и Шаг 5 не удался.
Все, что мне нужно было сделать, это заменить--fake-initialС--fakeчтобы заставить его работать.
Я столкнулся с этим сценарием, но мне никогда не приходилось удалять базу данных, чтобы решить эту проблему. Обычно я удаляю папку миграции из приложения и удаляю записи миграции из базы данных.
Я бы попытался запустить make migrations по одному приложению за раз. Если какой-либо из приложений полагается на другие таблицы, очевидно, добавьте их в последнюю очередь.
также я обычно просто бегу,python manage.py сделать эмиграцию потом просто python manage.py мигрировать даже с первоначальной миграции он должен работать нормально с Django 1.7 и 1.8.
Джанго ..., 1.8, 1.9, ...
то, что вы хотите достичь, - это раздавить существующие миграции и использовать для них замену.
как сделать это правильно без использования какой-либо команды при освобождении (случай без влияния на базу данных и сотрудников).
для каждого приложения, избавиться от своей папке migrations:
mv <app>/migrations/ <app>/migrationsOLD/для каждого запуска этого приложения:
python manage.py makemigrations <app>.настройка каждой новой миграции:
если у вас сложное приложение, или более приложений и связанных с ними моделей между ними, чтобы избежать
CircularDependencyErrorилиValueError: Unhandled pending operations for models:подготовьте вторую пустую миграцию в
<app>0002_initial2.py(поставьте там зависимость отapp_other::0001_initial.pyи<app>::0001_initial.pyа также-все ForeignKey, M2M, связанные с моделями, созданными на этапе миграции 0001 в других приложениях)все должно быть в порядок-иногда для подготовки потребуется больше миграций. Позаботьтесь о
dependenciesатрибут здесь в каждой миграции.позаботьтесь о начальных значениях-проверьте себя все
RunPythonдействияmigrationsOLDи скопируйте код в новую начальную миграцию, если это необходимо.(дополнительно к
--fake-initial) добавитьinitial=Trueко всем новым классам миграции (0002 тоже если добавился).- добавить
replacesатрибут в новом классе миграции. (как собственные, аsquashmigrations). Положите туда все старые миграции из<app>проверьте все с помощью
makemigrations.утверждать "никаких изменений не обнаружила"
проверить, если
migrate -lпоказать [x] вездеутверждать подобное:
[X] 0001_initial
[X] 0002_initial2 (102 раздавленных миграции)
пример:
для старый:
0001_initial.py 0002_auto.py ... 0103_auto.pyприготовление:
0001_initial.py 0002_initial2.py (optional but sometimes required to satisfy dependency)и добавить к
replacesк последнему (0002 здесь, может быть 0001):replaces = [(b'<app>', '0002_auto.py'), ..., (b'<app>', '0103_auto.py')]0001_initial.py должен быть назван так же, как старый.
0002_initial2.py это новый, но это замена для старых миграций, поэтому Django будет рассматривать его как загруженный.
если вы используете маршрутизаторы, может быть проблема там. Метод проверки
allow_migrateесли он выполняется правильно вrouters.py. Попробуйте установить возвращаемое значение всегда будетTrue, и проверить, решает ли это проблему,def allow_migrate(self, db, app_label, model_name=None, **hints): return True
Спасибо-я работал над этой проблемой некоторое время, и ваш список лучших практик был очень удобен. Это может потенциально помочь новичкам на python, как я:
Если вы начинаете с существующего набора моделей, очистите все предыдущие миграции, которые вы сделали!
моя ситуация была я начал с sqlite просто понять django, а затем переключился на MySQL db - и он продолжал бросать 1053 ошибка, вероятно, пытаясь применить предыдущую миграцию он не сделал есть ресурсы для решения...
Если вы все еще получаете эту ошибку при обновлении до Django 1.8, не забудьте сделать makemigrations и перенести отдельно для сторонних приложений, от которых зависят ваши приложения.
Comments