📦

Migrations(マイグレーション)

コードでデータベーススキーマをバージョン管理

MigrationはデータベーススキーマのRubyコードによる管理システムです。SQLを直接実行する代わりに、マイグレーションファイルを作成しrails db:migrateで適用します。

# db/migrate/20240101000000_create_posts.rb
class CreatePosts < ActiveRecord::Migration[8.0]
  def change
    create_table :posts do |t|
      t.string :title, null: false
      t.text :content
      t.references :user, null: false, foreign_key: true
      t.string :status, default: 'draft'
      t.timestamps  # created_at、updated_atを自動追加
    end

    add_index :posts, :status
  end
end

主要コマンド:

  • rails db:migrate — 未適用マイグレーション実行

  • rails db:rollback — 最後のマイグレーションを巻き戻し

  • rails db:migrate:status — マイグレーション適用状態確認

ファイル名のタイムスタンプ(20240101000000)で実行順序が決まり、schema_migrationsテーブルに適用済みマイグレーションが記録されます。

キーポイント

1

rails generate migration CreatePosts title:string content:text → マイグレーションファイル生成

2

生成ファイルのchangeメソッドにスキーマ変更を定義

3

create_table、add_column、remove_column、rename_column等のDSL使用

4

rails db:migrate実行 → SQLに変換されDBに適用

5

db/schema.rbが自動更新(現在のスキーマスナップショット)

6

rails db:rollbackで巻き戻し可能(changeメソッドは自動逆転)

メリット

  • DBスキーマをGitでバージョン管理
  • チームメンバー間スキーマ同期自動化
  • changeメソッドで自動ロールバックサポート
  • DB種類に依存しないDSL

デメリット

  • 本番マイグレーションは慎重に(データ損失リスク)
  • 大容量テーブルマイグレーションは時間がかかる
  • downメソッドがないとロールバック不可
  • マイグレーションファイルが増え続ける

ユースケース

テーブル作成/削除 カラム追加/修正/削除 インデックス追加 外部キー設定 チーム間スキーマ同期