Rails のDB操作コマンド入門:db:create から db:migrate まで
はじめに
Railsを使い始めると、データベース操作のコマンドが多くて混乱することがあります。
db:migrateとdb:schema:loadの違いがわからないdb:resetとdb:migrate:resetは何が違うの?- マイグレーションを間違えたときどうやって戻す?
この記事では Rails のDBコマンドを用途別にまとめて解説します。
前提:Railsのデータベース設定
データベースの接続情報は config/database.yml に書かれています。
default: &default adapter: mysql2 # または postgresql、sqlite3 encoding: utf8mb4 pool: 5 username: root password: host: localhost development: <<: *default database: myapp_development test: <<: *default database: myapp_test
コマンドを実行する際は RAILS_ENV によって対象のDBが変わります。デフォルトは development 環境です。
データベースを作る・消す
データベースを作成する
bin/rails db:create
config/database.yml に設定されたデータベースを作成します。development と test の両方が作成されます。
Created database 'myapp_development' Created database 'myapp_test'
データベースを削除する
bin/rails db:drop
データベースごと削除します。中のデータもすべて消えます。
マイグレーションを実行する
未実行のマイグレーションをすべて実行する
bin/rails db:migrate
db/migrate/ 配下のマイグレーションファイルのうち、まだ実行されていないものを順番に実行します。
マイグレーションの状態を確認する
bin/rails db:migrate:status
Status Migration ID Migration Name -------------------------------------------------- up 20240101000001 CreateUsers up 20240201000001 AddEmailToUsers down 20240301000001 CreatePosts
up が実行済み、down が未実行です。
1つ前に戻す
bin/rails db:rollback
直前に実行したマイグレーションを1つ取り消します。
複数まとめて戻す
bin/rails db:rollback STEP=3 # 3つ分戻す
スキーマを読み込む
schema.rb からテーブルを作成する
bin/rails db:schema:load
db/schema.rb を読み込んでテーブルを一括作成します。マイグレーションを1つずつ実行するのではなく、最終的なスキーマを直接適用します。
db:migrate と db:schema:load の違い
| db:migrate | db:schema:load | |
|---|---|---|
| 何をするか | マイグレーションファイルを順番に実行 | schema.rb を一括適用 |
| 使う場面 | 通常の開発・本番環境への反映 | 新しい環境のセットアップ |
| 速さ | マイグレーション数に比例 | 速い |
新しくプロジェクトに参加してローカル環境を作るときは db:schema:load の方が速くセットアップできます。ただし既存データがある環境では使えません(テーブルが上書きされます)。
シードデータを投入する
初期データを投入する
bin/rails db:seed
db/seeds.rb に書かれた内容を実行します。開発環境の動作確認用データや、マスターデータの初期投入に使います。
# db/seeds.rb User.create!(name: '管理者', email: 'admin@example.com', role: :admin)
まとめてやる系コマンド
DBを作成してマイグレーションも実行する
bin/rails db:create db:migrate
コマンドは && なしで並べて書けます。
DBを作成してスキーマ読み込み・シードも実行する
bin/rails db:create db:schema:load db:seed
Rails には db:setup という短縮コマンドもあります。
bin/rails db:setup
db:create + db:schema:load + db:seed を一括実行します。新しく環境を作るときの定番コマンドです。
環境によってdb:setupかdb:migrateを自動で使い分ける(Rails 6以降)
bin/rails db:prepare
DBが存在しなければ db:setup、すでに存在すれば db:migrate を実行します。CIや複数人での開発で「DBがある環境もない環境も同じコマンドで動かしたい」ときに便利です。
DBを作り直す(データが消える)
bin/rails db:reset
db:drop + db:create + db:schema:load + db:seed を一括実行します。開発中にDBを初期化したいときに使います。
マイグレーションをすべて戻して再実行する
bin/rails db:migrate:reset
db:drop + db:create + db:migrate を実行します。db:reset との違いは schema.rb ではなくマイグレーションファイルを使う点です。
よくあるシーン別まとめ
新しくプロジェクトをクローンした
bin/rails db:create db:schema:load db:seed
マイグレーションファイルを追加した
bin/rails db:migrate
マイグレーションを間違えた(直前のものを修正したい)
bin/rails db:rollback # マイグレーションファイルを修正 bin/rails db:migrate
開発中にDBをきれいにしたい
bin/rails db:reset
まとめ
| コマンド | 何をするか |
|---|---|
db:create |
データベースを作成する |
db:drop |
データベースを削除する |
db:migrate |
未実行のマイグレーションを実行する |
db:migrate:status |
マイグレーションの実行状態を確認する |
db:rollback |
直前のマイグレーションを取り消す |
db:schema:load |
schema.rbからテーブルを一括作成する |
db:seed |
初期データを投入する |
db:setup |
db:create + db:schema:load + db:seed をまとめて実行 |
db:prepare |
DBがなければdb:setup、あればdb:migrate(Rails 6以降) |
db:reset |
DBを作り直してschema.rbとseedを再実行 |
db:migrate:reset |
DBを作り直してマイグレーションを再実行 |
Rubyのバージョン管理については「Rubyのバージョン管理:rbenv・miseの使い方と切り替え方法」を参照してください。
SQLiteに直接ログインしてスキーマやデータを確認する方法は「SQLiteチートシート:ログインからスキーマ確認・DMLまとめ」を参照してください。