RailsでPostgreSQLを使うぞ!「FATAL: role "postgres" does not existの解消」にむけて


はじめに

Railsチュートリアなんとか一通り終え(理解度としては3割程度なので終えたと言えるかどうかはおいといて...)、
自身のローカル環境にてRuby, Railsの環境を構築する際に発生した問題に関して、自身のメモのため、初学者の方で同様の問題が発生した方向けに投稿します!

開発環境

  • macOS Catalina 10.15.7
  • MacBook Pro (13-inch, 2020, Two Thunderbolt 3 ports)
  • プロセッサ 1.4 GHz クアッドコアIntel Core i5
  • メモリ 8GB

  • Ruby 2.5.7

  • Rails 5.2.3

  • PostgreSQL 13.1

導入までの一連の流れに関して

一連の環境構築までの流れに関しては下記記事が大変参考になると思いますので、ぜひ見てください。
今回はPostgreSQLの導入部にフォーカスして記事を作りたいと思います!

【完全版】MacでRails環境構築する手順の全て
https://qiita.com/kodai_0122/items/56168eaec28eb7b1b93b

エラー FATAL: role "postgres" does not exist の発生

ここからが本題です!
一通り上記記事を参考に環境構築を終え、railsを起動しようとしたところ、

$ rails s

下記のようなエラーが発生し、railsをが起動できない状況に...

ん?そもそもロールってなに?
詳しくは下記が参考になると思いますが、

PostgreSQL 11.5文書
https://www.postgresql.jp/document/11/html/role-attributes.html

「PostgreSQLは、ロールという概念を使用してデータベースへの接続承認を管理する」らしい。
つまり、role postgres does not existというのは、ロール(データベースへアクセスする権限みたいなもの?)として、postgreがないよっていことで解釈しました。

そこで実際に下記コマンドを使用して、データベースのロール状態を確認すると...

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

postgres=# \du         # 現在のロール確認(ちなみにバッククオート\は「option+¥」キーですよ)

Role name   |                         Attributes                         | Member of 
---------------+------------------------------------------------------------+-----------
 araishuntarou | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
               |                                                        | {}

やはりRole nameにpostgresがない!!

では、ここのroleにpostgresを追加すれば全てが解決できるぞと思い、
コマンド入力! そしてすかさず確認!

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

postgres=# \du         # 現在のロール確認(ちなみにバッククオート\は「option+¥」キーですよ)

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

やったー!roleにpostgresが追加できてる。うれしー。これで解決と思いました...。

第二の関門 PG::InsufficientPrivilege: ERROR: permission denied to create database

やっとの思いで、railの起動まで辿り着きましたが、

$ rails s

なんとまたエラーが発生!!心折れます....。
PG::InsufficientPrivilege: ERROR: permission denied to create database
う~ん、データベースを作る権限がないということかな?

言われてみれば確かに、postgresのAttributesに何の記述もされていないぞ。

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

そこで、postgres にsuperuserの権限を与えようと下記コマンドを実施!
superuserは「ログイン以外に何でもできる権限をロールに与える」ため、危険な場合もあるとのこと。
(ここら辺はあとで勉強しよう... 本来は目的に応じた権限のみを与えた方がいいのかも)

参考
https://eng-entrance.com/postgresql-role

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

postgres=# DROP ROLE postgres ;                   # 一度postgresを削除(役割だけを追加する方法が不明..)
postgres=# CREATE ROLE postgres SUPERUSER ;      # superuserの権限を持ったpostgresを作成!
postgres=# \du                                    # 現在のロール確認


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

やっとここまできたか...

最後の関門 ActiveRecord::PendingMigrationError

datebaseをmigrateしてないですよという意味だと捉え、

$ rails db:create   #データベース自体(テーブルを保管しておく全体のシステム)を作る

からの

$ rails db:migrate    #データベースの中にテーブルを作ったり、カラムを変更したりするときに実行する

を実行!!

最後に

$ rails s

出来たー!!!!

最後に

稚拙な文章にもかかわらず最後までお読みいただきまして誠にありがとうございました。
私も完全には理解できていないところが多く、これかわも勉強しなければなりませんが、
少同じ問題で困っている方々の助けに慣れれば幸いです!