Djangoからの「Django.db.utils.ProgrammingError:関係Django_migrationsのアクセス許可が拒否されました」エラーのトラブルシューティングと原因を絞り込むための基本的な手順は何ですか?
最初は安定した実稼働サーバーだったが、その後Django、Postgres、Apacheのいくつかの側面にいくつかの変更が加えられ、Githubからプルされた後にこのメッセージが表示されます。さらに、それらの変更が行われてからしばらく経ちましたが、問題を引き起こしている可能性のあるすべての変更を思い出せず、追跡することもできません。
python manage.py runserver
またはpython manage.py ...
以外のpython manage.py check
コマンドを実行すると、システムが正常であることを示すメッセージが表示されます。
この 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;"
@ 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_username
(my_username
ではなく)によって所有されているとしましょう。
所有者を更新するには、--username=other_username
でpsql
を呼び出してから、所有者を変更する必要があります。
ALTER TABLE public.<table_name> OWNER TO my_username;