web-dev-qa-db-ja.com

「Django.db.utils.ProgrammingError:関係Django_migrationsのアクセス許可が拒否されました」のトラブルシューティング手順

Djangoからの「Django.db.utils.ProgrammingError:関係Django_migrationsのアクセス許可が拒否されました」エラーのトラブルシューティングと原因を絞り込むための基本的な手順は何ですか?

最初は安定した実稼働サーバーだったが、その後Django、Postgres、Apacheのいくつかの側面にいくつかの変更が加えられ、Githubからプルされた後にこのメッセージが表示されます。さらに、それらの変更が行われてからしばらく経ちましたが、問題を引き起こしている可能性のあるすべての変更を思い出せず、追跡することもできません。

python manage.py runserverまたはpython manage.py ...以外のpython manage.py checkコマンドを実行すると、システムが正常であることを示すメッセージが表示されます。

29
user3062149

この 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;"
76
user3062149

@ 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の一部です system catalogs 、リレーショナルデータベース管理システムがスキーマメタデータを格納する場所。

問題のテーブルがother_usernamemy_usernameではなく)によって所有されているとしましょう。

所有者を更新するには、--username=other_usernamepsqlを呼び出してから、所有者を変更する必要があります。

ALTER TABLE public.<table_name> OWNER TO my_username;
2
Brad Solomon