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
が変更される。