bin/rails db

データベースに関する操作をするコマンド。

bin/rails dbbin/rails dbconsoleのショートハンドでRDBのクライアントを起動する。

このページでは、bin/rails db:migrateなどdbのサブコマンドbin/rails db:*を説明する。

タスクの定義はhttps://github.com/rails/rails/blob/main/activerecord/lib/active_record/railties/databases.rakeにある。

以下、非公開とついているコマンドはbin/rails -Tなどで表示されないコマンド。

データベース

bin/rails db:create

データベースを作成する。デフォルトではdevelopment環境とtest環境のデータベースを作成。

RAILS_ENV=production bin/rails db:createのように環境を指定可能。

bin/rails db:create:all

すべての環境のデータベースを作成する。

bin/rails db:drop

development環境とtest環境のデータベースを削除する。

RAILS_ENV=production bin/rails db:dropのように環境を指定可能。

bin/rails db:drop:all

すべての環境のデータベースを削除する。

bin/rails db:seed

db/seeds.rbを適用する。

bin/rails db:seedコマンドは実行済のような情報は持たないので、db/seeds.rbの内容がUser.create(...)なら実行した回数分、Userデータが作成される事になる。

bin/rails db:seed:replant

すべてのテーブルをTRUNCATEしてからbin/rails db:seedを実行する。

非公開 bin/rails db:migrate:reset

bin/rails db:drop; bin/rails db:create; bin/rails db:migrateと同じ結果になる(というか、これらのコマンドを実行している)。

bin/rails db:reset

bin/rails db:drop; bin/rails db:setupと同じ結果になる(というか、これらのコマンドを実行している)。

bin/rails db:setup

bin/rails db:create; bin/rails environment; bin/rails db:schema:load; bin/rails db:seedと同じ結果になるっぽい。

定義が以下のようになっており、:environmentで何が実行されるのかよくわからない。

  desc "Creates the database, loads the schema, and initializes with the seed data (use db:reset to also drop the database first)"
  task setup: ["db:create", :environment, "db:schema:load", :seed]

bin/rails db:prepare

データベースがある場合はbin/rails db:migrate、データベースがない場合はbin/rails db:setupを実行するイメージ。

データベースがなくdb/schema.rbもない場合はbin/rails db:create; bin/rails db:migrate; bin/rails db:seedを実行するイメージ。

マイグレーション

bin/rails db:migrate

マイグレーションをすべての適用する。

bin/rails db:migrate VERSION=20210306181524のように指定したマイグレーションまで適用することもできる。

bin/rails db:migrate:up VERSION=...

指定したVERSIONのマイグレーションのみ適用する。

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210306181524  Create users
  down    20210306181618  Add columns to user
  down    20210306181642  Add birthday columns to user

この状態でbin/rails db:migrate:up VERSION=20210306181642を実行すると以下の状態になる。

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210306181524  Create users
  down    20210306181618  Add columns to user
   up     20210306181642  Add birthday columns to user

bin/rails db:migrate:down VERSION=...

指定したVERSIONのマイグレーションの適用を戻す。

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210306181524  Create users
   up     20210306181618  Add columns to user
   up     20210306181642  Add birthday columns to user

この状態でbin/rails db:migrate:down VERSION=20210306181618を実行すると以下の状態になる。

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210306181524  Create users
  down    20210306181618  Add columns to user
   up     20210306181642  Add birthday columns to user

bin/rails db:rollback

マイグレーションを適用前に戻す。デフォルトではマイグレーションファイル1つ分戻す。

bin/rails db:rollback STEP=2のようにSTEPを指定すれば指定した個数分戻す。

非公開 bin/rails db:forward

マイグレーションを進める。デフォルトではマイグレーションファイル1つ分進める。

bin/rails db:forward STEP=2のようにSTEPを指定すれば指定した個数分進める。

注意点としては、bin/rails db:migrate:downしているマイグレーションが途中にある場合、それらのマイグレーションも実行される。bin/rails db:versionで表示されるマイグレーションの次のマイグレーションまですべて適用した状態にすると考えればよさそう。

bin/rails db:migrate:redo

デフォルトではbin/rails db:rollback; bin/rails db:migrateと同じ結果になる。未実行のマイグレーションがあればそれも実行される。

bin/rails db:migrate:redo STEP=2bin/rails db:rollback STEP=2; bin/rails db:migrateと同じ結果になる。

bin/rails db:migrate:redo VERSION=...bin/rails db:migrate:down VERSION=...; bin/rails db:migrate:up VERSION=...と同じ結果になる。なので、指定したVERSIONのマイグレーションのみ再適用されて、未実行のマイグレーションは影響を受けない。

bin/rails db:version

現在適用されているマイグレーションで最も新しいバージョンを表示する。途中のマイグレーションがbin/rails db:migrate:downされていても結果に影響しない。

bin/rails db:migrate:status

マイグレーションの適用状況を表示する。

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210306181524  Create users
  down    20210306181618  Add columns to user
  down    20210306181642  Add birthday columns to user

非公開 bin/rails db:abort_if_pending_migrations

適用されていないマイグレーションの一覧を表示する。

You have 3 pending migrations:
  20210306181524 CreateUsers
  20210306181618 AddColumnsToUser
  20210306181642 AddBirthdayColumnsToUser
Run `bin/rails db:migrate` to update your database then try again.

ダンプ

削除予定 bin/rails db:structure:dump

スキーマ情報をSQLでdb/structure.sqlファイルにダンプするコマンド。Rails 7で削除予定。

参考:Rails: db:structure:loadとdb:structure:dumpタスクが非推奨化(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

削除予定 bin/rails db:structure:load

スキーマ情報をSQLでdb/structure.sqlファイルからロードするコマンド。Rails 7で削除予定。

参考:Rails: db:structure:loadとdb:structure:dumpタスクが非推奨化(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

bin/rails db:schema:dump

スキーマ情報をダンプするコマンド。デフォルトではdb/schema.rbにダンプする。

config.active_record.schema_format:sqlを指定するとdb/structure.sqlファイルにダンプする。

bin/rails db:schema:load

スキーマ情報をロードするコマンド。デフォルトではdb/schema.rbをロードする。

config.active_record.schema_format:sqlを指定するとdb/structure.sqlファイルをロードする。

その他

bin/rails db:schema:cache:dump

ActiveRecordはデータベースにSHOW FULL FIELDS テーブル名クエリを発行してモデルの構築をしている。そのため、本番環境ではPumaのワーカーの数*モデルクラスの数分のクエリが発行されることとなり、余計な負荷につながる。

bin/rails db:schema:cache:dumpを実行すると型情報などを記録したdb/schema_cache.ymlファイルが生成され、クエリを発行せずにこのファイルを元にモデルの構築をするようになる。

bin/rails db:schema:cache:clear

db/schema_cache.ymlファイルを削除する。

bin/rails db:environment:set

production環境での誤爆防止機能としてar_internal_metadataテーブルに環境情報を保持しているが、別のデータベースからデータをインポートした場合などに環境情報が食い違ってしまうことがある(productionからstagingにダンプデータをインポートする場合など)。

そう言った場合に、bin/rails db:environment:set RAILS_ENV=stagingを実行するとar_internal_metadataが指定した環境に更新される。

bin/rails db:fixtures:load

bin/rails db:seedと似ているが、こちらはtest/fixtures/*からデータを読み込むコマンド。

bin/rails db:system:change

RDBを変更したい場合(例えばPostgreSQLからMySQLに載せ替えるなど)に使うコマンド。Gemfileconfig/database.ymlが変更される。