###開発環境
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
端的に説明すると、
- データーベースを管理するのはrole。
- 最初にsuperuserがOSユーザーと同じ名前で作られるけど、権限が強すぎて危険。
- 安心安全のために、他の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=#
となります。
スーパーユーザー名(OSユーザー名)が"fuga"で、
テーブル名が"hogehoge"だと、
$ sudo -u fuga psql hogehoge
psql (11.4)
Type "help" for help.
hogehoge=#
となります。
後日談
この記事を投稿後、無事未経験転職が決まり、自社開発企業で働き始めました。
Laravelで開発することになったのですが、環境構築の際にこの記事で問題にしているエラーの原因が、envファイルにちゃんとパスワードが設定できていなかったことだと判明しました。