Django column "name" отношения "django_content_type" не существует

Я продолжаю получать следующую ошибку при выполнении миграции (python manage.py migrate):

django.db.utils.ProgrammingError: column "name" of relation "django_content_type" does not exist

Я сделал следующее, чтобы исправить это, но безуспешно:

  • Я удаляю все файлы миграции для каждой модели
  • удалены все записи в django_migrations
  • запустить python manage.py migrate --fake-initial

Запуск Django 1.8.2.

python manage.py showmigrations
admin
 [ ] 0001_initial
auth
 [ ] 0001_initial
 [ ] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002
contenttypes
 [X] 0001_initial
 [ ] 0002_remove_content_type_name
hashtags
 [ ] 0001_initial
 [ ] 0002_hashtagvisit_user
posts
 [ ] 0001_initial
 [ ] 0002_auto_20150530_0715
sessions
 [ ] 0001_initial
users
 [ ] 0001_initial

Спасибо за помощь.

Ответы

Ответ 1

Обнаружено это при обновлении до 1,8 и миграции из MySQL в Postgres.

Я не могу объяснить, почему возникает ошибка, но мне удалось обойти это, вручную добавив столбец:

  • Удалить все миграции

  • Удалить записи из django_migrations

  • Вручную добавьте столбец name:

    ALTER TABLE django_content_type ADD COLUMN name character varying(50) NOT NULL DEFAULT 'someName';
    
  • Запустить поддельный начальный: $ python manage.py migrate --fake-initial

Редактировать 12/2016. Я рекомендую это как обходной путь, более подходящий для личных проектов или локальных сред, а не для производственных сред. Очевидно, что если вы заботитесь о своей истории миграции, это не путь.

Ответ 2

Сегодня я столкнулся с той же проблемой, и хотел бы добавить краткий обзор проблемы и ее решение:

Источник проблемы:

Django 1.8 изменил свои внутренние структуры базы данных, а столбец name больше не существует в базе данных (см. взято из атрибута verbose_name модель).

Чтобы это сделать, автоматически создается миграция contenttypes - 0002_remove_content_type_name.

Обычно все ваши миграции должны быть применены, и это должно быть записано в таблице django_migrations, и все должно быть хорошо.

Если вы, например, сделали резервную копию своей базы данных с помощью dumpdata, очистили (сбросили) все содержимое базы данных и загрузили дамп с помощью loaddata, ваша таблица django_migrations останется пустой.

Таким образом, migrate пытается снова применить все миграции (даже если ваши таблицы уже существуют), и он не работает, когда пытается удалить несуществующий столбец name.

Вы можете проверить, применима ли эта ситуация, либо проверив таблицу django_migrations, либо - гораздо более удобную - запустив python manage.py showmigrations. Если ваша ситуация выглядит как

contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name

вы в порядке (или на самом деле у вас другая проблема), если это выглядит как

contenttypes
 [ ] 0001_initial
 [ ] 0002_remove_content_type_name

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

Что делать/шаг за шагом Решение:

Итак, наша структура базы данных в порядке (за исключением изменений, которые вы хотели применить при неудачной миграции), но Django/migrate просто не знает об этом. Поэтому давайте сделаем что-нибудь об этом:

  • Скажите Django, что все миграции contenttypes были применены: manage.py migrate --fake contenttypes. Если вы хотите дважды проверить, запустите showmigrations.

  • Не указывать Django, что все миграции до того, который вы хотите применить, были применены. Для этого вам потребуется номер миграции, как показано на рисунке showmigrations. Например, если ваша ситуация выглядит как

    my_app
     [ ] 0001_initial
     [ ] 0002_auto_20160616_0713
    

    и ваш migrate не удалось при использовании 0002_auto_20160616_0713, последний успешно примененный перенос в вашей базе данных был 0001_initial. Затем Wen применяет запись в django_migrations -table на python manage.py migrate --fake my_app 0001 (помните, что количество миграций достаточно). migrate автоматически подделывает все другие зависимые миграции, если это необходимо.

  • Теперь мы можем применить миграцию missiong, и на этот раз нам нужно сделать это по-настоящему и не подделано! Итак, мы запускаем python manage.py migrate my_app. Это должно изменить базу данных по мере необходимости.

    Если ваша последняя миграция зависит от других миграций, которые еще не были подделаны, вы должны их заранее подделать.

  • Двойная проверка и очистка: снова используйте showmigrations, чтобы проверить, было ли применено все миграции. Если есть открытые миграции, подделайте их, используя python manage.py migrate --fake.

Вещи, которые вы не должны делать

  • удалить все миграции - в производственном параметре это может быть просто неприменимо, поскольку они могут содержать некоторую работу для переноса данных, которые не должны быть потеряны.
  • вручную добавить столбец name в contenttypes - он будет удален после применения миграции. Хорошо, это рабочий хак, но он не адресует проблему.

Что вы должны делать

Попытайтесь выяснить, как вы попали в эту ситуацию, и найти способы избежать этого.

Моя проблема заключалась в том, что у меня были разные базы данных для моего проекта (sqlite для быстрого тестирования разработки, локальные postgres для тестирования в реальном мире, удаленные постгрессы для производства), и я хотел копировать контент из одного в другой.

Ответ 3

Я получал эту ошибку после того, как мы решили удалить миграции из управления версиями (git) и создать новую базу данных с нуля.

Что-то, что сработало для меня (хотя, честно говоря, я не уверен, почему) было запускать "makemigrations" для каждого приложения. так что "python manage.py makemigrations app1", "python manage.py makemigrations app2" и т.д. для каждого приложения Django.

Наконец, я просто запускал "python manage.py migrate", пересек мои пальцы, и это сработало.

Любое понимание того, как и почему это сработало, было бы полезно.

Ответ 4

Я знаю, что это старый вопрос, но это может помочь кому-то. Я тоже получал эту ошибку. Проблема заключалась в том, что content_types имела миграцию с именем 0002_remove_content_type_name, которая удаляет столбец "имя".
После удаления данных миграции из таблицы и папки эти шаги работают для меня:

./manage.py makemigrations myappname
./manage.py migrate myappname
./manage.py migrate --fake contenttypes

Если вы уверены, что остальная часть вашего db отражает вашу миграцию, вы можете использовать:

./manage.py migrate --fake

Смотрите результат:

./manage.py showmigrations

После этого все ваши миграции должны быть отмечены, и вы должны быть в порядке

Ответ 5

У меня была та же проблема, но я смог ее решить, добавив это в мои зависимости миграции:

('contenttypes', '0002_remove_content_type_name')

Надеюсь, что это поможет!

Ответ 6

Другим вариантом, который работал у меня (из пустой базы данных), был:

./manage.py makemigrations myappname
./manage.py migrate

Вариант, который НЕ работает:

./manage.py makemigrations myappname
./manage.py migrate myappname

Или, скорее, последовательность, по-видимому, будет работать в первый раз, но не будет работать во второй раз, жалуясь, что django_content_type не существует.

Рабочий (первый 2-строчный) вариант выше, кажется, идемпотентен.

(отредактировано: для удаления избыточной второй строки из исходной 3-строчной рабочей версии)