1. ホーム
  2. ruby-on-rails

[解決済み】PG::ConnectionBad: fe_sendauth: パスワードが供給されない

2022-01-27 10:57:27

質問

ローカルの postgres データベースで "rake test" を実行しようとすると、上記の例外がスローされます。

以下は、私のpg_hba.confファイルです。 # Unixドメインソケットによるデータベース管理ログイン ローカルのすべてのpostgresピア

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             username                                  peer
local   myapp_dev   myapp                               md5
local   myapp_test  myapp                               md5
local   myapp_prod  myapp                               md5
#local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            md5
#host    replication     postgres        ::1/128                 md5

そして、以下は私の database.yml の関連するセクションです。

test:

adapter: postgresql
database: myapp_test
pool: 5
timeout: 5000
host: localhost
username: username
password:

実際のdatabase.ymlでは、'username'は私が実際にログインしているユーザー名で置き換えられています。 認証方法は「peer」と定義されているので、パスワードは必要ないはずです。

また、Postgresを再起動するようにしました。

sudo -u postgres pg_ctlcluster 9.3 main restart

他に何か足りないものはありますか?

解決方法は?

localhost というのは、ホストがTCPコネクションを指すので、認証方式が md5 (パスワードが必要)に従って pg_hba.conf :

# IPv4 ローカル接続。
ホストすべて 127.0.0.1/32 md5
# IPv6 ローカル接続。
ホストすべて すべて ::1/128 md5

については peer メソッドを使うには、Unix ドメインソケットで接続する必要があり、debian 系の OS を使っているようなので、そのために /var/run/postgresql の中に host フィールドを使用するか、あるいはまったく使用しないかです (環境変数に指定がない限り、これがデフォルトです)。

EDIT: データベースURIを使用する場合(Rails-4.1よりサポート。 http://weblog.rubyonrails.org/2014/4/8/Rails-4-1/ ) のような構文になる可能性があります。

  • はlocalhostの場合です。
    test: "postgresql://localhost/myapp_test"

  • は、デフォルトのUnixソケットドメイン(hostフィールドは空白)。
    test: "postgresql:///myapp_test"