OperationalError at /admin/
FATAL: Peer authentication failed for user "myuser"
これは、Django adminサイトにアクセスしようとすると表示されるエラーです。MySQLデータベースは問題なく使用していました。PostgreSQLを初めて使用しましたが、ホストI最終的にこのプロジェクトに使用する計画にはMySQLがありません。
そのため、PostgreSQLのインストールプロセスを実行し、syncdb
を実行し、すべてを設定できると考えました。
問題は、データベースに接続するようにアプリを取得できないように見えることです。ダウンロードしたコマンドラインまたはデスクトップアプリからPostgreSQLにログインできます。スクリプトではありません。
また、manage.py Shell
データベースに正常にアクセスします。
何かご意見は?
例外を覗いてみると、接続設定に関係していることがわかりました。 settings.pyに戻り、ホストのセットアップがないことがわかりました。 localhost
と出来上がりを追加します。
私のsettings.pyにはMySQLデータベース用のホストがありませんでしたが、PostgreSQLが動作するように追加する必要がありました。
私の場合、localhost
設定にHost
を追加しましたが、うまくいきました。
これは私のsettings.py
のDATABASES
セクションです。
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': '<MYDATABASE>',
'USER': '<MYUSER>',
'PASSWORD': '<MYPASSWORD>',
'Host': 'localhost', # the missing piece of the puzzle
'PORT': '', # optional, I don't need this since I'm using the standard port
}
}
これはおそらく、接続しようとしているユーザー以外のユーザーの下でスクリプトが実行されているためです(myuserhere)。この場合、ピア認証は失敗します。ピア認証を使用していないため、Host: "localhost"
を使用したソリューションが機能します。ただし、Unixソケットを使用する代わりにTCP接続を使用します。 Django docs :を使用するため、Host: ""
よりも低速です。
PostgreSQLを使用している場合、デフォルトで(空のホスト)、データベースへの接続はUNIXドメインソケット(pg_hba.confの「ローカル」行)を介して行われます。 TCPソケットで接続する場合、Hostを 'localhost'または '127.0.0.1'(pg_hba.confの 'Host'行)に設定します。Windowsでは、常にHostを定義する必要があります。 UNIXドメインソケットは利用できないためです。
ソケットを使い続ける場合は、pg_hba.conf
の正しい設定が必要です。最も簡単なのは:
local all all trust
構成内の他のすべてのlocal
行をコメントアウトします。この変更を有効にするには、postgresの再読み込みが必要であることに注意してください。
しかし、マルチユーザーの実稼働マシンが問題になっている場合は、md5
(さまざまな認証方法の説明については here を参照)のようなより安全なものを使用することができます。
完全に信頼するよりも、md5に設定するだけです。
# "local" is for Unix domain socket connections only
local all all md5
/etc/postgres/9.1/main/pg_hba.confの下部を編集して修正しました(md5を信頼するように変更します。これは、データベースパスワードがないことを意味します。
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
Host all all 127.0.0.1/32 trust
# IPv6 local connections:
Host all all ::1/128 trust
私はちょうど同じ問題に出くわしましたが、climeが言ったように、まだpeer
メソッドを使用して、UNIXソケットを使用したかったのです。 pg_hba.conf
内のsystem-usernameをpostgres-usernameにマッピングしました。これはpeer
メソッドで動作します。
内部pg_hba.conf
を追加しました:
local all all peer map=map-name
内部pg_ident.conf
を追加しました:
map-name mysystem-username mypostgres-username