Rails のDB操作コマンド入門:db:create から db:migrate まで

スポンサーリンク

Rails のDB操作コマンド入門:db:create から db:migrate まで

はじめに

Railsを使い始めると、データベース操作のコマンドが多くて混乱することがあります。

  • db:migratedb:schema:load の違いがわからない
  • db:resetdb: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 に設定されたデータベースを作成します。developmenttest の両方が作成されます。

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:migratedb: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まとめ」を参照してください。