Django 1.8 не работает django.db.utils.ProgrammingError: отношения "auth_user" не существует
У меня был рабочий проект с django 1.7, и теперь я перевел его на django 1.8.
Я могу сделать syncdb
и запустить приложение с помощью sqlite, но когда я переключаюсь на postgres, он не выполняет syncdb:
Creating tables...
Creating table x
Creating table y
Running deferred SQL...
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "~/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "~/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "~/venv/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
File "~/venv/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "~/venv/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 25, in handle
call_command("migrate", **options)
File "~/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 120, in call_command
return command.execute(*args, **defaults)
File "~/venv/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "~/venv/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 179, in handle
created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
File "~/venv/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 317, in sync_apps
cursor.execute(statement)
File "~/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
File "~/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
File "~/venv/lib/python2.7/site-packages/django/db/utils.py", line 97, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "~/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 62, in execute
return self.cursor.execute(sql)
django.db.utils.ProgrammingError: relation "auth_user" does not exist
Я попытался удалить базу данных и воссоздать ее.
Кроме того, я пробовал:
python manage.py migrate auth
который также терпит неудачу:
django.db.utils.ProgrammingError: relation "django_site" does not exist
LINE 1: SELECT (1) AS "a" FROM "django_site" LIMIT 1
Пожалуйста, помогите устранить это.
Ответы
Ответ 1
Мне не понравилась идея комментировать/раскомментировать код, поэтому я попробовал другой подход: я перенял "вручную" некоторые приложения, а затем запустил django-admin.py migrate
для остальных. После удаления всех файлов *.pyc
моя последовательность команд была:
$ django-admin.py migrate auth
$ django-admin.py migrate contentypes
$ django-admin.py migrate sites
$ django-admin.py migrate MY_CUSTOM_USER_APP
$ django-admin.py migrate
где MY_CUSTOM_USER_APP
- это имя приложения, содержащего модель, которую я установил AUTH_USER_MODEL
в мой файл settings
.
Надеюсь, это поможет. Кстати, странно, что лучший способ синхронизировать ваш db в Django 1.8 настолько сложный. Интересно, не хватает ли я чего-то (я не очень хорошо знаком с Django 1.8, я работал со старыми версиями)
Ответ 2
Всегда переносите db с python manage.py makemigrations
, а затем python manage.py migrate
в более новые версии. Для ошибки выше, если в первый раз вы переносите свою базу данных, используйте python manage.py migrate --fake-initial
. См. Docs https://docs.djangoproject.com/en/1.9/ref/django-admin/#django-admin-migrate
Ответ 3
Работа с Django 1.10 Я обнаружил другое решение:
Мое приложение называется "web", и сначала я вызываю:
python manage.py makemigrations web
то я вызываю:
python manage.py makemigrations auth
то я вызываю:
python manage.py migrate
Пораженный: ЭТО РАБОТАЕТ!:)
Кажется, auth искал AUTH_USER_MODEL "web.UserProfile" и отношение с именем web_user_profile, и он не нашел его, следовательно, ошибку.
С другой стороны, вызов makemigrations web сначала создает требуемое отношение, прежде чем auth сможет проверить и предупредить его не там.
Ответ 4
У меня была такая же проблема, и я часами стучал головой, пытаясь найти решение, которое было скрыто в комментариях. Моя проблема заключалась в том, что CircleCI не смог запустить тесты из-за этой ошибки. И я подумал, что мне нужно будет начать новую работу с новой и пустой БД. Но у меня такие же ошибки. Все было похоже на "auth", "contenttypes" и "sites".
Я читал этот и этот, а также this, а также . Для меня не было решений.
Итак, после того, как я уничтожил свою БД и создал новую, единственным решением, которое я нашел, чтобы полностью избежать этих django.db.utils.ProgrammingError
, было следующее:
- Прокомментируйте весь код, относящийся к модели
User
.
- Удалить все .pyc файлы в моем проекте!
find . -name "*.pyc" -exec rm -- {} +
Спасибо @max!
- run
./manage.py migrate
(без подделки, без подделки-инициализации, без миграции 'auth' или 'contenttypes' до, juste plain migrate.
- Раскомментируйте приведенный выше код и снова запустите миграцию!
My INSTALLED_APP:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.contenttypes',
'django.contrib.sites',
'django.contrib.auth',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'mptt',
'djangobower',
'honeypot',
'django_hosts',
'leaflet',
'multiselectfield',
'corsheaders',
'rest_framework_swagger',
'allauth',
'allauth.account',
# 'allauth.socialaccount',
# 'allauth.socialaccount.providers.twitter',
# 'allauth.socialaccount.providers.facebook',
'project.<app_name>',
)
Ответ 5
В моем случае эта ошибка появлялась, когда драйвер postgresql смог подключиться к базе данных, но предоставленный пользователь не имеет доступа к схеме или таблицам и т.д. Вместо того, чтобы сказать, что разрешение запрещено, показанная ошибка говорит о том, что запрашиваемая таблица базы данных не найдена. Как правило, в такой ситуации команда migrate также django_migrations
ошибкой с аналогичной ошибкой при django_migrations
создать таблицу django_migrations
.
Проверьте доступ, предоставленный пользователю, которого вы используете для подключения к базе данных в Django.
Ответ 6
Удаление файлов миграции, связанных файлов .pyc и просто для безопасности всех файлов .pyc с помощью следующих команд не решило мою проблему.
$ find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
$ find . -path "*/migrations/*.pyc" -delete
$ find . -name "*.pyc" -exec rm -- {} +
То, что в итоге решило мою проблему, заключалось не в очистке кэшей, а в том, что у меня была функция, выполняющая запрос в качестве параметра функции по умолчанию. В init, что делают команды, такие как makemigrations
и migrate
перед выполнением, кажется, что django (возможно, атрибут python?) Инициализирует все параметры по умолчанию.
Так как моя база данных была полностью пустой (мне нужно было выполнить migrate --run-syncdb
для воссоздания таблиц), когда указанный ниже параметр по умолчанию был инициализирован, он выполнил запрос к пустой базе данных, который впоследствии завершился migrate --run-syncdb
.
изменить это:
def generate_new_addresses(number=1, index=None, wallet=get_active_wallet()):
...
...
return
чтобы:
def generate_new_addresses(number=1, index=None, wallet=None):
if not wallet:
wallet = get_active_wallet()
...
...
return
Ответ 7
У меня была та же проблема, но моей основной причиной был файл __init__.py
в одной из папок миграции, который был удален из исходного кода, но не локально (что приводило к ошибкам "Не на моей машине").
Папкам миграции все еще нужны файлы __init__.py
, даже с Python 3.
Ответ 8
Ошибка в основном потому, что db (postgres или sqlite) не нашли отношения, для которого вы вставляете или выполняете CRUD. Решение состоит в том, чтобы сделать миграции
python manage.py makemigrations <app_name> python manage.py migrate