Edited at

Railsで ActiveRecord::ConnectionNotEstablished: No connection pool with 'primary' found. がでたら確認すること。

More than 1 year has passed since last update.

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")