データベース接続エラーが解消しない理由は大きな勘違いだった

2026/03/01

db
docker

1. 起きていた事象(トラブルの内容)

Rails 8.1.2 / Ruby 4.0.1 移行に伴って、
Docker環境でアプリを起動しブラウザでアクセスすると、
赤い画面で「PG::UndefinedTable」というエラーが発生しました。
データベースにテーブルが一つも存在しない状態でした。

2. なぜこの問題が起きていたのか(原因)

本プロジェクトは、標準の db/schema.rb ではなく Ridgepole でデータベース構成を管理しています。
通常のRailsの手順(db:schema:load など)でずっと作業しようとしており、何度リセットしてもテーブルが作成されないという「的外れな対応」が続いていました。

3. どうやって原因を特定したのか(分析プロセス)

以下のステップで、目に見えない矛盾を一つずつ潰していきました。

  1. 実態調査: データベースの中にどんなテーブルがあるか直接コマンド(psql)で確認。→ 管理用の2つしかなく、アプリ用のテーブルがゼロであることを発見。
  2. Railsの認識確認: Railsがどこのデータベースを見ているか設定値を書き出し。→ 設定(db:app_development)は正しいことを確認。
  3. 設計図の検査: db/schema.rb の中身を直接表示。→ 内容が「version: 0」で中身が空っぽであることを発見。
  4. 構造の再定義: ローカルのファイル構成を画像で確認。→ db/schema/primary/ 内に大量の .schema ファイルがあるのを見つけ、Ridgepole管理であることを特定。

4. どうやって修正したのか(解決策)

このプロジェクト専用の「設計図の統合・反映コマンド」を実行することで解決しました。

  1. コンテナの完全リセット:
    docker-compose down --volumes で、一度矛盾が生じたネットワークとデータのゴミを完全に掃除しました。
  2. 特殊コマンドによるテーブル構築:
    bin/rails ridgepole:apply を実行。これにより、分割されていた数十個の設計図が統合され、データベースに全てのテーブル(player_public_profiles等)が正しく作成されました。
  3. テストデータの投入:
    bin/rails db:seed を実行し、空っぽのテーブルにテスト用のユーザーデータなどを流し込みました。

5. 教訓

「Rails=schema.rb」という固定観念を捨てる

Railsアプリだからといって、必ずしも標準の db/schema.rb でデータベースを管理しているとは限らない。

ファイル構成を先に疑う

「コマンドが成功しているのに反映されない」という矛盾が起きたときは、自分の操作を疑う前に、まず db/ フォルダの中身(ファイル構成)を目視で確認する。.schema ファイルが大量にある時点で、標準の db:schema:load は「使ってはいけないコマンド」だった。

AI(Gemini)の「標準的な回答」を過信しない

AIは一般的なケース(標準的なRails構成)を前提に回答しがち。プロジェクト固有の特殊なツール(Ridgepoleなど)が導入されている場合、AIの指示通りにリセット(docker-compose down --volumes等)を繰り返すと、解決から遠ざかるだけでなく、無駄な作業を増やすことになる。

エラー画面の「指示」が罠になることもある

Railsのエラー画面は親切に bin/rails db:migratedb:schema:load を提案してくるが、Ridgepole導入環境ではそのアドバイス自体が「間違い」である。画面の指示を鵜呑みにせず、プロジェクトの「流儀」を確認することが最優先。