LoginSignup
72
54

More than 3 years have passed since last update.

FATAL: role "postgres" does not exist を解決した話。

Last updated at Posted at 2019-08-26

開発環境

macOS Mojave 10.14
PHP 7.2
Laravel 5.8
PostgreSQL 11.4

PostgreSQL歴二日で遭遇したエラーです。
前提としてPHP、Laravel、PostgreSQLの環境構築後、データベース"hogehoge"を作成して、マイグレーションファイルを準備した後の話になります。

下記コマンドを打ってみると、

 $  php artisan migrate

エラーが発生。

Illuminate\Database\QueryException  : SQLSTATE[08006] 
[7] FATAL:  role "postgres" does not exist 
(SQL: select * from information_schema.tables where table_schema = public and table_name = migrations and table_type = 'BASE TABLE')

role "postgres" が存在しないと言っています。
roleって?と思ったので色々記事を漁ってみると、
下記の参考記事にたどり着きました。

参考記事
https://www.postgresql.jp/document/11/html/role-attributes.html

端的に説明すると、
1. データーベースを管理するのはrole。
2. 最初にsuperuserがOSユーザーと同じ名前で作られるけど、権限が強すぎて危険。
3. 安心安全のために、他のroleを作りましょう

と言っています。

roleの状態がどうなっているか確認します。

データベースの状態を確認する

データベース"postgres"に接続するコマンドを打ってみます。

※本来なら、現在使用中の"hogehoge"に接続するべきですが、その時はコマンドの意味がわかっていませんでした。ご了承ください。

$ psql postgres
psql (11.4)
Type "help" for help.

postgres=# \l         ## データベースリスト確認コマンド

すると、

                        List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+-------+----------+---------+-------+-------------------
 postgres  | ksk   | UTF8     | C       | C     | 
 template0 | ksk   | UTF8     | C       | C     | =c/ksk +
           |       |          |         |       | ksk=CTc/ksk
 template1 | ksk   | UTF8     | C       | C     | =c/ksk +
           |       |          |         |       | ksk=CTc/ksk
 hogehoge  | ksk   | UTF8     | C       | C     | 
(4 rows)

データベース"hogehoge"は作成されていることが確認できました。
念の為、接続できているか確認してみます。

postgres=# \c hogehoge    ## データーベースへの接続  
You are now connected to database “hogehoge” as user "ksk".

接続はうまくいっているようです。

roleの状態を確認

コマンドを打ちます。

postgres=# \du       ## 既存のロールを列挙する
                                  List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 ksk       | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

確かに、roleにはユーザー名が入っているのですが、superuserとなっていて、今回はここにpostgresという名前のroleがないということが問題なのです。

解決方法

とりあえず、role"posgres"を作成するコマンドを打ちます。

$ createuser postgres 

参考記事
https://www.postgresql.jp/document/11/html/database-roles.html

確認してみます。

$ psql postgres
psql (11.4)
Type "help" for help.

postgres=# \du     ## さらにロールを確認します。

すると、

                                    List of roles
 Role name |                         Attributes                                                            | Member of 
-----------+------------------------------------------------------------+-----------
 ksk       | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 postgres  |     

確かに、postgresという名前で入っています!

マイグレーションを実行

$ php artisan migrate
Migration table created successfully.
Migrating: XXXX_XX_XX_000000_create_users_table
Migrated:  XXXX_XX_XX_000000_create_users_table (0.17 seconds)
Migrating: XXXX_XX_XX_100000_create_password_resets_table
Migrated:  XXXX_XX_XX_100000_create_password_resets_table (0.02 seconds)

成功です!

もっとスマートな方法があったかもしれませんし、余計な説明が入っているかもしれませんが、参考になれば、と思います。また、間違い等ご指摘いただければ幸いです。

おまけ(参考までに)

テーブルへの接続コマンド
1.

 $ psql postgres   ## postgres というテーブルに接続の意。

hogehogeというテーブル名であれば、

$ psql hogehoge 
psql (11.4)
Type "help" for help.

hogehoge=#

となります。

2.
スーパーユーザー名(OSユーザー名)が"fuga"で、
テーブル名が"hogehoge"だと、

$ sudo -u fuga psql hogehoge
psql (11.4)
Type "help" for help.

hogehoge=#

となります。

後日談

この記事を投稿後、無事未経験転職が決まり、自社開発企業で働き始めました。

Laravelで開発することになったのですが、環境構築の際にこの記事で問題にしているエラーの原因が、envファイルにちゃんとパスワードが設定できていなかったことだと判明しました。

72
54
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
72
54