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

###開発環境
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ファイルにちゃんとパスワードが設定できていなかったことだと判明しました。