RailsのDBまわりではまった。Modelで以下のようなエラーがでる。
ActiveRecord::Base
を継承したMyAppModel
でDBアクセスを試みると以下のようなエラーがでた。
ActiveRecord::ConnectionNotEstablished: No connection pool with 'primary' found.
「コネクションプールにコネクションがない」 というメッセージだけ。
そもそも接続情報があっているのかっていうあたりのメッセージがないので、詳細な状況がわからない。
RailsConsoleでいろいろやって調べられそうだったのでそうした。
$ ./bin/rails c
コンソールを開いてDBにちゃんとつながっているか確認する。
コネクションまわりは基底の ActiveRecord::Base
でやってたはずだよね、という朧気な記憶から探っていく。
# なんかそれらしいメソッドがないか探す
pry(main)> ActiveRecord::Base.methods.grep(/conn/)
=> (省略)
# それらしいメソッドがあったので確認
pry(main)> ActiveRecord::Base.connected?
=> nil
# つながっていない
# 次にconfigがどうなってるか確認したい
# Rails.configuration から取得できるらしい
pry(main)> Rails.configuration.instance_values.grep(/database/i)
=> []
pry(main)> Rails.configuration.methods.grep(/database/i)
=> [:database_configuration]
# こちらにもそれらしいメソッドがある
pry(main)> Rails.configuration.database_configuration[ENV['RAILS_ENV']]
=> {"adapter"=>"postgresql", "encoding"=>"utf8", "pool"=>5, "database"=>"app_dev", "username"=>"usr_dev", "host"=>"localhost"}
# 設定はちゃんと読み込まれているので、明示的にコネクションを作成する
pry(main)> ActiveRecord::Base.establish_connection(
pry(main)* Rails.configuration.database_configuration[ENV['RAILS_ENV']]
pry(main)* )
=> 省略
# 改めて接続確認
pry(main)> ActiveRecord::Base.connected?
=> true
ということで、ちゃんとDBに接続できた。
原因
ActiveRecordを使わない設定でApplicationが作られていて config/application.rb
で無効化されていたため。
require_relative "boot"
require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
# require "active_job/railtie"
# require "active_record/railtie"
require "active_storage/engine"
# 以下略
require active_record/railtie
をコメントアウトしているので無効の状態になっていた。このコメントを外すことでActiveRecordが使えるようになる。
バージョン情報
pry(main)> Rails.version
=> "5.2.0"
pry(main)> ActiveRecord.version
=> Gem::Version.new("5.2.0")
Rails6系でもそのまま適用できそう。