結論
①データベースを作成していなかったことが直接の原因。
②エラー調査のためpostgresqlにログインするときに失敗したのは、ナンバーロックがオフになった状態で数字をテンキーで入力したことが原因と思われる。これがエラー理由を誤信させ、エラーが長引いた原因。
環境
Windows10home
rails5.2.4
postgresql 12.3
状況
RailsアプリのCRUD処理まで実装した後、GitHubに上げるため、database.yml
のユーザーネームとパスワードを平文から環境変数に変更。
環境変数変更に使用したgemはdotenv-rails
。
その後もビューの確認のため、シード投入やデータベースリセットを繰り返していたが、その中で急にpostgresqlに繋がらなくなった。
gem "dotenv-rails"
上記のbundle install
をした後に以下のファイルをRailsアプリ直下に作成。
DB_USERNAME = psqlのユーザー名を入力
DB_PASSWORD = psqlのパスワードを入力
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV["DB_USERNAME"] %>
password: <%= ENV["DB_PASSWORD"] %>
development:
<<: *default
database: CRUD_app_development
test:
<<: *default
database: CRUD_app_test
production:
<<: *default
database: CRUD_app_production
username: CRUD_app
password: <%= ENV['CRUD_APP_DATABASE_PASSWORD'] %>
$ rails db:seed
rails aborted!
PG::ConnectionBad: FATAL: �f�[�^�x�[�X"CRUD_app_development"�͑��݂��܂���
bin/rails:4:in `require'
bin/rails:4:in `<main>'
Tasks: TOP => db:abort_if_pending_migrations
(See full trace by running task with --trace)
文字化けは原文のまま。
このエラー表示の前に、database.yml
の設定ミスによる異なるエラー表示もあったが、ターミナルを閉じたので正確には分からない。
確かパスワードを入力していなかったのが原因だったと思う。
試したこと
環境変数の内容は正しいのか?nilになっていないか → ○ rails c
で環境変数を入力して確認
database.yml
のユーザー名とパスワードを平文にして実行 → × 同じエラー
postgresqlにログインしてテーブルを確認する → パスワードを入力しても認証失敗でログインできず。ということは、postgresqlのユーザーネームかパスワードが正しくないことが原因か?
原因
$ rails db:create
Created database 'CRUD_app_development'
Database 'CRUD_app_test' already exists
開発環境だけデータベースが作成されていなかった。
というのも、シードデータ投入とリセットを繰り返す中でデータが完全に消去されなかったため、rails db:drop
を実行していた。
そのときはdatabase.yml
の設定でテスト環境にユーザーネームとパスワードをしていなかったので、エラーが発生。
そのエラー内容をよく見ておらず、このときに開発環境のデータベースがドロップされたことに気づかずに作業を進めていた。
登録したパスワードでpostgresqlにログインできなかったため、今回のエラー原因がpostgresqlのユーザー・パスワード設定にあると勘違いしたことがエラーが長引いた原因。
教訓
エラー内容はよく見ましょう。
なお、rails db:create
後は、postgresqlにログインできた。
なぜ?データベース作成後でないとpostgresqlにログインできないのはおかしいのではないか。
試しに再度rails db:drop
してログインを試したら普通にログインできた。
予想される原因としては、テンキーで数字を入力しているため、ナンバーロックがオフになった状態で入力したことが考えられる。なんともお粗末な原因。