はじめに
Railsのマイグレーションについて、なんとなく使っていたものの根本的な理解の部分が足りていないと感じていたので、改めて基礎から理解を深めていきたいと思います💪
同じような方や初学者の方の参考になれば嬉しいです!
マイグレーションとは
マイグレーション(migration)とは日本語で「移行」や「移動」を意味し、Railsにおいてはデータベースのスキーマ(構造)を管理・変更するための仕組みを指します。
プログラムのコード変更を管理するために「Git」を使いますが、マイグレーションはデータベースの構造変更をバージョン管理するためのツールと考えるとイメージしやすいかと思います!
データベースが作成される仕組み
マイグレーションの理解を深めるために、Railsアプリケーションでデータベースがどのように作成されるかを確認していきます🙌
簡単なイメージ図を作成してみたので、こちらもあわせて参考にしてください!!
1.接続先の設定
Railsがデータベースという違う世界とやりとりするためには、まず「どのRDBMS(MySQLやPostgreSQLなど)を使うのか?」「ユーザー名やパスワードは何か?」を知る必要があります。
その情報をRailsに教えてあげるのがconfig/database.ymlファイルになります!
2. データベースの作成
設定ファイルconfig/database.ymlをもとに、データベースの「箱(入れ物)」だけを作成します。
このときに使うコマンドが以下になります。
rails db:create
このコマンドを実行すると、database.ymlに記載されている情報をもとに、指定されたRDBMS上にデータベースが作成されます。ちなみに、この段階ではまだusersテーブルやarticlesテーブルなどは存在せず、空っぽのデータベースが作成されるだけです。
開発において最初のみしか実行しないコマンドなので、あまり馴染みがないかもしれません😂
3. 設計図の作成(マイグレーションファイル)
ここから開発で必要となる具体的なテーブルの構造を定義します。
例えば、usersテーブルを作成したい場合は、以下のコマンドを実行しマイグレーションファイルを作成します。
rails generate migration CreateUsers
このコマンドを実行すると、db/migrateディレクトリにタイムスタンプ付きのマイグレーションファイル(20251203123456_create_users.rbのようなファイル名)が作成されます。
このファイルの中に、usersテーブルのカラムやデータ型などの情報を記述していきます✍️
class CreateUsers < ActiveRecord::Migration[8.0]
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps
end
end
end
マイグレーションファイルの具体的な書き方については、Railsガイドに詳しく記載されているので、そちらを参考にしてください😊
4. テーブルの構築
最後に、作成した設計図(マイグレーションファイル)をデータベースに適用します!
rails db:migrate
このコマンドを実行すると、
- Railsが
db/migrateディレクトリ内のマイグレーションファイルを順番に読み込み、定義された内容に基づいてSQL(CREATE TABLE ...など)に翻訳してデータベースにテーブルやカラムを作成・変更します。 -
db/schema.rbファイルが更新され、現在のデータベースのスキーマ情報が反映されます。
db/schema.rbファイルとは?
- データベースの現在の構造を一目で確認できる「スナップショット」ファイル
- マイグレーションファイルが「変更履歴」だとすると、
schema.rbは「最新の完成図」 - マイグレーションを実行するたびに自動的に更新され、データベースの構造がどのようになっているのか一目で確認できるため便利⭐️
マイグレーションの仕組み
タイムスタンプ
マイグレーションファイルを作成すると、ファイル名の先頭にタイムスタンプが自動的に付与されます。
タイムスタンプとは下記例の20251120164103部分
(例:db/migrate/20251120164103_create_comments.rb)
これは「いつ作られたか」を表す日時(UTC)であり、マイグレーションIDとして扱われます。 Railsはこの数字が小さい(古い)順にファイルを読み込むことで、データベースの変更の順番を保証しています。
schema_migrationsテーブル
マイグレーションの仕組みを理解するには、schema_migrationsテーブルの存在を知る必要があります!
このテーブルはdb/schema.rbには記載されていませんが、Railsがマイグレーションの状態を管理するために内部的に使用している特別なテーブルです。
(↓実際のschema_migrationsテーブルの中身の例)
rails db:migrate実行時の流れ
- Railsはまず
schema_migrationsテーブルを確認し、すでに適用されたマイグレーションファイルのID(タイムスタンプ)を取得 -
db/migrateディレクトリ内のマイグレーションファイルをタイムスタンプ順にチェックし、schema_migrationsテーブルに存在しないIDのファイルだけを実行
逆にいうと、すでにschema_migrationsテーブルに存在するIDのファイルはスキップされる - 実行が成功したら、そのマイグレーションIDを
schema_migrationsテーブルに追加し、次回以降の実行時に再度適用されないようにする - 実行後のデータベースの状態を
db/schema.rbに反映する
Q. rails db:schema:loadコマンドとは?
-
db/schema.rbファイルの内容を直接データベースに反映するコマンドです! - 使用タイミングとしては、プロジェクトの開発環境のセットアップや、データベースを初期化したいとき、テスト環境の準備などに利用されます。
rails db:migrateとの違い
| rails db:migrate | rails db:schema:load | |
|---|---|---|
| 実行内容 | マイグレーションファイルを1つずつ順番に実行 | schema.rbを一気に読み込んで反映 |
| 速度 | 遅い(特にマイグレーションが多い場合) | 速い |
| 用途 | 開発中の通常のマイグレーション実行 | 新規環境のセットアップ |
注意点
- このコマンドは、仕様として「既存のデータが入っていても、一旦テーブルを空にして作り直す(リセットする)」という挙動をするため、データが入っている状態で使用するとそのデータが消えてしまいます。
- そのため、通常の開発中にはあまり使わず、新規セットアップやテスト環境での利用に限定するのが一般的です。(もちろん本番環境ではもってのほかです)
参考記事


