localhost:3000にアクセスし、 ブラウザサーバーを起動した際に以下のエラーが発生しました。
ActiveRecord::ConnectionNotEstablished
No connection pool with 'primary' found.
このエラーの解決の筋道を備忘録として残します。
#前提
本エラーはajax_appというリポジトリのアプリケーションを作成するにあたり、
chat_appというリポジトリを複製、編集を行いajax_appを作成しております。
#内容
##1.エラー文の理解
ActiveRecord::ConnectionNotEstablished
No connection pool with 'primary' found.
→これは何を言っているのかを理解する
Googleで検索、以下の投稿から
データベースとの繋がりが形成されていない
ことが想定されます
##2.エラーの箇所の想定(ここはある程度経験が必要?)
データベースと接続していない原因は
migrateファイル
datebase.yaml
のどちらかと想定される。
ちなみに、
migrateファイル はデータベース内のテーブルを取り扱う設計図。
datebase.yaml はデータベースそのものを扱う設計図。
という認識で良いかと思います。
migrateファイルの基本的なエラーはrails db:migrateされていない事による
ActiveRecord::PendingMigrationError
が一般的。今回は当該エラーではなかったので、
datebase.yaml
がエラーの原因と想定。
##3.ターミナルのエラー文の理解
datebase.ymlに原因があることがわかったが、datebeseの内容は正しい。(テキスト通り)
# MySQL. Versions 5.5.8 and up are supported.
#
# Install the MySQL driver
# gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
# gem 'mysql2'
#
# And be sure to use new-style password hashing:
# https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html
#
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password:
socket: /tmp/mysql.sock
development:
<<: *default
database: ajax_app_development
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: ajax_app_test
# As with config/credentials.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
# DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
# production:
# url: <%= ENV['DATABASE_URL'] %>
#
production:
<<: *default
database: ajax_app_production
username: ajax_app
password: <%= ENV['FIRST_APP_DATABASE_PASSWORD'] %>
そこで、データベースの状況を確認するため rails db:create:status を実行。
以下のエラーが表示された。
Rails couldn't infer whether you are using multiple databases from your database.yml and can't generate the tasks for the non-primary databases. If you'd like to use this feature, please simplify your ERB.
rails aborted!
Google翻訳を使用し、日本語に訳します。
Railsは、database.ymlから複数のデータベースを使用しているかどうかを推測できず、非プライマリデータベースのタスクを生成できません。この機能を使用する場合は、ERBを簡略化してください。
なお、
エラーが起こった際に検索、翻訳をを行うキーワードは
・couldn’t
・error
・false など
エラーにまつわる文言を含む文を検索することがよいでしょう
##4.エラーの箇所の想定
以上よりデータベース(sequel pro)を確認すると、
ajax_app_development データベースが存在しないことが判明。
データベースが存在しないため、アクセスに関するエラーが出ていたことがわかった。
ajax_app_development データベースが存在しないことが判明。
#原因
今回、first_appという一度作成済みのファイルを編集して、ajax_appと名前を変えて使用しておりました。
本来、datebase.yml内の first_app と明記されている箇所を ajax_app と書き換えて、rails db:create
を実行する必要があります。
おそらく、該当箇所をfirst_appに書き換える前に rails db:create を実行した後に書き換えを行ったため、ajax_appのデータベースは作成されず、接続しているdbはfirst_app_developmentのままであったことが原因だったと考えられます。
つまり、ajax_appのdatebase.ymlとfirst_appのdatebase.ymlがどちらともfirst_app_developmentデータベースに接続していたため、エラーが生じました。
##修正
以上の原因から
first_appデータベースを削除 rails db drop
ajax_appデータベースの生成 rails db create
以上で新たに ajax_app のデータベースを作成し、localhost:3000にアクセス
→アクセスできました。
#総括
##エラー解決までの流れ
・エラー文の解読
↓
・問題箇所の想定
↓
・エラー文の解読
↓
問題箇所の想定
以上の繰り返し
エラー文は以下のキーワードを含む文に注目
・couldn’t
・error
・false
google翻訳にかけて意味を理解して良い。
以上を心がけて行うと、理解が深まると思います。