PostgreSQLで以下のようにpsql -U postgres
コマンドを入力するとエラーになるります。その原因と対処法を解説します。
% psql -U postgres
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: role "postgres" does not exist
PostgreSQLコマンド構文
postgresql データベースコマンド
データベースに入る
$ psql <DB_NAME>
ユーザーを指定してデータベースに入る
$ psql -U <USER_NAME> <DB_NAME>
PostgreSQLではユーザー名をロール名と呼んでいます。以下ではユーザー名とロール名が混在していますが、同一の意味で用いています。
PostgreSQLのデータベース接続コマンドでは、ユーザー名とデータベース名両方が省略可能です。
-U <USER_NAME>
を省略すると、ユーザー名は現在のmacのユーザー名を用います。
<DB_NAME>
を省略するとmacのユーザー名のデータベースに接続しようとします。
ユーザー名とデータベース名を省略した場合としなかった場合の組み合わせは以下の4通りです。xxx
は現在のmacユーザーです。
$ psql
ロール名 xxx で データベース xxxに接続
$ psql postgres
ロール名 xxx で データベース postgresに接続
$ psql -U xxx
ロール名 xxx で データベース xxx に接続
$ psql -U xxx postgres
ロール名 xxx で データベース postgres に接続
データベース接続コマンドの実行結果
インストールした状態で、各コマンドを実行すると以下の結果になります。
% psql
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: database "xxx" does not exist
% psql postgres
psql (14.6 (Homebrew))
Type "help" for help.
% psql -U xxx
psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: database "xxx" does not exist
% psql -U xxx postgres
psql (14.6 (Homebrew))
Type "help" for help.
データベースとユーザー一覧
そもそもデータベースとユーザーには何が存在するのでしょうか。とりあえずログイン出来るpsql postgres
を実行してpostgresに入り、確認してみます。
データベース一覧
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+--------+----------+---------+-------+-------------------
postgres | xxx | UTF8 | C | C |
template0 | xxx | UTF8 | C | C | =c/xxx +
| | | | | xxx=CTc/xxx
template1 | xxx | UTF8 | C | C | =c/xxx +
| | | | | xxx=CTc/xxx
ユーザー情報一覧
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
xxx | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
データベース postgres
とユーザーxxx
のみが存在している状態のようです。
そのため、それぞれのコマンドは以下の結果となりエラーメッセージと整合性が取れる。
$ psql
ロール名 xxx で データベース xxxに接続
-> データベース xxx は存在しない
$ psql postgres
ロール名 xxx で データベース postgresに接続
-> OK
$ psql -U xxx
ロール名 xxx で データベース xxx に接続
-> データベース xxx は存在しない
$ psql -U xxx postgres
ロール名 xxx で データベース postgres に接続
-> OK
結論
psql -U postgres
を実行した際に、FATAL: role “postgres” does not existが発生する原因は、role postgres
が存在しない状態で、role postgres
でログインしようとしているからです。
homebrew経由でインストールした際のmacユーザーのrole名が自動的に作成されているようですので、そのユーザー名を指定してログインすることで正常にログイン出来るようになります。
その際データベース名は唯一存在するpostgresを明示的に指定するか、省略することで暗黙にpostgresが指定されます。
psql -U xxx postgres
psql -U xxx
参考
エラーメッセージの内容は、role postgresは存在しない
この件に関する説明は以下のページが詳しいです。