Docker上のRailsでデータベースの情報が取得できない時の対処法|エラー:ActiveRecord::ConnectionNotEstablished

rails-prograshi(プロぐらし)-kv Rails
記事内に広告が含まれていることがあります。

Docker上に起動しているコンテナでRailsを使ったプロジェクトがあるときに、ローカルでモデルを使ってデータベースの中身を確認したいときがあります。

そのときに、「rails c」コマンドでRailsのコンソールに入って、「user.all()」といったメソッドを実行した場合に以下のようなエラーが発生することがあります。

ActiveRecord::ConnectionNotEstablished

このときの原因と対処法をまとめています。


エラーの原因

エラーの原因は、コンテナの中ではなく、ローカルのディレクトリの中でRailsコンソールを起動している可能性が最も高いです。

ローカル環境のディレクトリにRailsがインストールしてある場合、「rails c」を実行するとローカルのRailsのプロジェクトのコンソールを立ち上げることができます。

しかし、これはDocker上のRailsコンテナとは完全な別物になります。

このため、ローカルのプロジェクト中に、指定したモデルがないと「ActiveRecord::ConnectionNotEstablished」というエラーが発生します。


対処法

対処法はDockerで起動しているコンテナの中に入って、「rails c」でRailsコンソールを立ち上げてコマンドを実行することです。

以下で実例で手順を解説しています。


起動中のRailsコンテナ名を確認する

Docker上のRailsコンテナに入るために、まずは起動中のコンテナ一覧を表示して、コンテナ名を確認します。

起動中のコンテナを確認するコマンドは以下です。

$ docker ps


実例

#コンテナ名の確認
$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED        STATUS        PORTS                                            NAMES
588188913f4c   rails6-docker-alpine_web    "bin/rails s -p 3000…"   3 hours ago    Up 3 hours    0.0.0.0:3000->3000/tcp                           rails6-docker-alpine_web_1
6a965250e960   postgres:11.1-alpine        "docker-entrypoint.s…"   20 hours ago   Up 3 hours    5432/tcp                                         rails6-docker-alpine_db_1

上記の場合、RailsのコンテナはコンテナID「588188913f4c」、コンテナ名「rails6-docker-alpine_web_1」です。


Railsコンテナの中に入る

続いてRailsのコンテナの中に入ります。起動中のコンテナに入るコマンドは以下です。

$ docker exec -it <コンテナ名> sh


実例

#コンテナ内に入る
$ docker exec -it rails6-docker-alpine_web_1 sh
/usr/src/app #

するとアプリケーションのディレクトリの場所の後ろに「#」が表示されます。

これでDockerコンテナの中のRialsでコマンドを入力できる状態になります。


Railsコンソールを起動する

Railsのコンソールを起動します。

# rails c


実例

/usr/src/app # rails c
Running via Spring preloader in process 130
Loading development environment (Rails 6.1.3.1)
irb(main):001:0>

railsのコンソール「irb」が起動しました。


モデル経由でデータベースのデータを取得する

これで、モデル経由でデータベースのデータを取得できる状態になっています。

例えば、userモデルを使って、usersテーブルのid番号1のデータを取得する場合は以下のようになります。

実例

irb(main):004:0> User.find(1)
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, name: "aaabbb", created_at: "2021-04-03 07:35:30.551136000 +0000", updated_at: "2021-04-03 07:53:48.907671000 +0000">

無事データが取得できました。


タイトルとURLをコピーしました