Джанго миграции: связь уже существует
У меня проблемы с миграцией моделей Django. У меня есть несколько моделей в моем приложении, и у меня уже есть некоторые данные внутри. Когда я добавил несколько моделей в свое приложение, и я запускаю makemigrations
, приложение сообщает, что нет никаких изменений. Я знаю, что иногда возникали некоторые ошибки при переносе, поэтому я удаляю таблицу django_migrations из своей базы данных и запускаю makemigrations
снова, и теперь программа обнаружила мои новые поля.
Проблема в том, что если я бегу migrate
Система скажет мне, что некоторые таблицы уже существуют. (Что нормально и правильно, потому что они делают). Я не хочу удалять эти таблицы, потому что у меня есть данные уже внутри.
Я не могу бежать migrate --fake
, потому что программа будет думать, что у меня уже есть все таблицы, что не соответствует действительности.
Итак, я ищу способ сообщить программе: запустите миграцию, если таблица существует, пропустите ее. (--fake
Это)
Другой вопрос: почему это происходит со мной, что миграция не распознает мои изменения (некоторые проблемы с кешем,...)?
2 ответа
Как насчет этого?
python manage.py makemigrations
(Пропустите этот шаг, если у вас уже есть готовый файл миграции)
Это создаст миграции для этого пакета, скажем, с именем, например, 0001_initial.py
Отредактируйте файл вручную, чтобы удалить все модели, кроме уже созданных в базе данных.
Теперь вы делаете поддельную миграцию. Это синхронизирует вашу базу данных с моделями.
python manage.py migrate --fake
Затем снова запустите makemigrations, чтобы создать остальные таблицы вместе с новым файлом миграции.
python manage.py makemigrations
Что касается вашего другого вопроса, почему makemigrations не распознали ваши модели, может быть по следующим причинам:
- Миграции для этих изменений уже есть в некотором файле миграции.
- Вы пропустили упоминание package_name в INSTALLED_APPS, но я думаю, что вы сделали это здесь.
Каждый раз, когда вы вносите изменения в свои модели, попробуйте эти шаги:
python manage.py makemigrations [your app name]
затем:
python manage.py migrate
это должно работать нормально. но помните, если у вас уже есть данные (строки) в ваших таблицах, вы должны указать значение по умолчанию для каждого запроса.
если нет, Django предложит вам указать значение по умолчанию для них, или вы можете просто попытаться использовать blank=True
или же null=True
в ваших полях, как показано ниже:
website = models.URLField(blank=True)
Возможная причина или это в том, что у вас другая миграция в той же папке начинается с того же префикса... возможно, вы делаете еще одну миграцию в той же таблице в другой ветке или фиксируете, чтобы она была сохранена в db с тем же префиксом, то есть: 00010_migration_from_commit_#10, 00010_migration_from_commit_#11
решение для этого - переименовать файл миграции, например, 00011_migration_from_commit_#11
Я попытался отредактировать связанный файл миграции и прокомментировал часть, в которой создается этот конкретный столбец, а затем запустил
python manage.py migrate
Основная проблема - существующие таблицы, которые отключают перенос новых таблиц, поэтому решение простое:
** Попробуйте добавить managed = False к существующему дБ, чтобы он не был обнаружен при миграции
** Повторите это для всех существующих старых таблиц:
class Meta:
managed=False
Иногда становится скучно, когда у нас много таблиц в одном приложении, но оно работает отлично!
Проверьте свои таблицы db, чтобы убедиться, что вы не пытаетесь воссоздать таблицу во время миграции. вот что это было для меня. Если у вас есть данные в таблице, которые вы не хотите удалять, удалите все миграции из папки app_name/migrations, а затем запустите./manage.py migrate app_name --fake default
затем попробуйте makemigrations и мигрируйте для остальных