python manage.py миграция —поддельный против python manage.py перенести —поддельный ноль

#django #sqlite #django-models #django-migrations

#django #sqlite #django-модели #django-миграции

Вопрос:

Когда я запускаю python manage.py migrate --fake photos zero :

Выполняемые операции:
отменить все миграции: фотографии, выполняющие миграции: состояния модели рендеринга… СДЕЛАНО
, не применяя photos.0001_initial… ПОДДЕЛАННЫЙ

После выполнения вышеуказанной команды я запустил python manage.py migrate в то время, когда произошла эта ошибка.

Обратная трассировка: обратная трассировка (последний последний вызов):

Файл «C:Users …libsite-packagesdjangodbbackendssqlite3base.py «, строка 411, в базе данных execute return.Cursor.execute(self, запрос)

django.db.utils.OperationalError: таблица «photos_userphoto» уже существует

Когда я запускаю python manage.py migrate --fake photos :

Выполняемые операции: Применить все миграции: фотографии Запуск миграции: применение фотографий.0001_initial… ПОДДЕЛЬНОЕ применение фотографий.0002_auto_20210303_0120… ПОДДЕЛАННЫЙ

После выполнения приведенной выше команды я запустил python manage.py migrate , и это работает отлично.

 Running migrations:
  Applying photos.0003_auto_20210303_0123... OK
 

Итак, мой вопрос в том, в чем разница между python manage.py migrate --fake <appname> vs python manage.py migrate --fake <appname> zero и почему первая команда выдает мне ошибку?

Спасибо..

Ответ №1:

Похоже, у вас какое-то недопонимание по поводу --fake флага. Согласно документации --fake флаг:

Помечает миграции до целевой (следуя приведенным выше правилам) как применяемые, но без фактического запуска SQL для изменения схемы вашей базы данных.

В нем также указано, что он предназначен для опытных пользователей, если они вносят изменения вручную. По сути, Django создает таблицу django_migrations для управления вашими миграциями. Он добавляет к нему запись, чтобы отметить, была ли применена миграция. Что --fake нужно, так это просто добавлять / удалять записи в / из этой таблицы в соответствии с указанным вами переносом. Также zero средство для отмены всех миграций.

 python manage.py migrate --fake photos zero
 

Приведенная выше команда означает, что вы в основном говорите Django:

У меня есть или я вручную удалю (d) все таблицы и т.д. из базы данных для фотографий приложения

 python manage.py migrate --fake <appname>
 

В приведенной выше команде вы не указываете миграцию (в предыдущей вы указали ноль), это означает предположить, что вы имеете в виду до самой последней миграции. В основном с --fake помощью этой команды означает:

У меня есть или я буду вручную создавать все таблицы и т.д. в базе данных для миграции до самой последней.

Насколько я понимаю, вы только внесли некоторые изменения и хотели обновить свою базу данных, для этого вы могли бы просто написать:

 python manage.py migrate