Шаги по устранению неполадок "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;