Шаги по устранению неполадок "django.db.utils.ProgrammingError: разрешение отклонено для отношения django_migrations"
Каковы некоторые основные шаги для устранения неполадок и сужения причины "ошибки django.db.utils.ProgrammingError: разрешено для связи django_migrations" из Django?
Я получаю это сообщение после того, что изначально был стабильным производственным сервером, но с тех пор имел некоторые изменения в нескольких аспектах Django, Postgres, Apache и pull от Github. Кроме того, прошло некоторое время с тех изменений, которые были сделаны, и я не помню или не могу отслеживать каждое изменение, которое может вызвать проблему.
Я получаю сообщение, когда я запускаю python manage.py runserver
или любую другую команду python manage.py ...
, кроме python manage.py check
, которая утверждает, что система хороша.
Ответы
Ответ 1
Мне удалось решить мою проблему на основе инструкций из этого question. В принципе, привилегии postgres должны быть повторно предоставлены пользователю db. В моем случае это был пользователь, которого я установил в файле настроек виртуальной среды. Выполните следующее из командной строки (или в postgres), где mydatabase
и dbuser
должны быть вашей собственной базой данных и именами пользователей:
psql mydatabase -c "GRANT ALL ON ALL TABLES IN SCHEMA public to dbuser;"
psql mydatabase -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to dbuser;"
psql mydatabase -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to dbuser;"
Ответ 2
Как упомянуто @user3062149, это, вероятно, вызвано попыткой перенести таблицу базы данных, для которой пользователь Django psycopg2 не является владельцем таблицы. Например, если у вас есть проект settings.py
DATABASES = {
'default': {
'USER': 'my_username',
# ...
Вам нужно будет проверить, что таблица, вовлеченная в миграцию Django, принадлежит my_username
. Для этого в psql
вы можете использовать SELECT * FROM pg_tables ORDER BY tableowner;
. При этом используется представление pg_tables
, которое "обеспечивает доступ к полезной информации о каждой таблице в базе данных". pg_tables
является частью системных каталогов Postgres, места, где система управления реляционными базами данных хранит метаданные схемы.
Предположим, что эта таблица принадлежит other_username
(не my_username
).
Чтобы обновить владельца, вам нужно позвонить psql
с --username=other_username
, а затем сменить владельца:
ALTER TABLE public.<table_name> OWNER TO my_username;