bin/rails db
データベースに関する操作をするコマンド。
bin/rails dbはbin/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=2はbin/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に載せ替えるなど)に使うコマンド。Gemfileやconfig/database.ymlが変更される。