← PC・IT用語集へ戻る

マイグレーション

Migration
development data beginner
データベースのテーブル構造(設計図)の変更や、データを安全に移行するための仕組みと操作。
マイグレーション (Migration)

概要(サマリー)

マイグレーション(Migration)とは、IT分野において様々な「移行(引っ越し)」を指す言葉だが、Web開発においては主にデータベースの構造(テーブルの設計図)を作成・変更するための仕組みや操作を指す。
「建物のリフォーム(増改築)の指示書」にたとえられる。手動で直接壁を壊すのではなく、「ここに新しく子供部屋(カラム)を追加する」「壁を取り払う」といった具体的な変更手順をプログラムコード(設計書)として残しておき、それを実行することで、誰のパソコンでも、また本番環境でも、全く同じ安全な手順でデータベースの工事(テーブル構造の書き換え)を行えるようにする。

詳細解説

マイグレーションとは何か

Webアプリケーションを作る際、データベースにデータを保存するためには「ユーザー情報テーブル」「商品テーブル」などの「箱(テーブルの構造)」を定義する必要がある。この構造のことをスキーマと呼ぶ。
開発を進める中で、「やっぱりユーザー情報に『自己紹介欄(bioカラム)』を追加したい」といったスキーマの変更が必ず発生する。その際、各開発者が手動でデータベース管理ツール(phpMyAdminなど)を開いて変更を加えていると、変更の適用漏れが起きたり、チーム内でデータベースの構造がバラバラになったりしてシステムが動かなくなる。
この問題を解消するために、データベースの構造変更の履歴を「コードのファイル(マイグレーションファイル)」として残し、プログラムで一括適用するのがデータベースマイグレーションである。

なぜマイグレーションが必要なのか

  1. Gitなどによるバージョン管理ができる:
    マイグレーションファイルはただのテキストコードなので、Gitで履歴管理ができる。「誰が、いつ、データベースをどう変更したか」がすべて記録される。
  2. 複数人での開発がスムーズになる:
    他のメンバーがデータベースを変更した場合も、最新のコードを取り込んで「マイグレーション実行コマンド」を叩くだけで、自分のパソコン内のデータベースが瞬時に相手と同じ最新構造にアップデートされる。
  3. 本番環境への安全なデプロイ:
    テスト環境から本番環境(サーバー)へプログラムを移す(デプロイする)際、ボタン一つで安全に本番データベースを最新の設計書通りに作り直したり更新したりできる。

マイグレーションコードの例(Laravelの場合)

多くのWebフレームワークPHPLaravelや、Ruby on Railsなど)には、この仕組みが標準で備わっている。
以下は、ユーザー情報テーブルに新しく「年齢(age)」カラムを追加するためのLaravelのマイグレーションファイルのコード例である。

<?php
// PHP/Laravelの例:データベースマイグレーションファイル

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * マイグレーション実行時の処理 (Up)
     * データベースに変更を加える(年齢カラムを追加)
     */
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            // usersテーブルに、整数型の「age(年齢)」カラムを追加する
            // null(空欄)の保存も許可する(nullable)
            $table->integer('age')->nullable()->after('name');
        });
    }

    /**
     * ロールバック(元に戻す)時の処理 (Down)
     * 加えた変更をキャンセルして元に戻す(年齢カラムを削除)
     */
    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            // usersテーブルから「age」カラムを削除する
            $table->dropColumn('age');
        });
    }
};

このように、変更を加える「Up」と、万が一のために元に戻す「Down」のセットを書いておくことで、システムをいつでも安全な状態に巻き戻す(ロールバックする)ことができる。

マイグレーションの命名とファイル管理

マイグレーションファイルには、ファイル名の先頭に「タイムスタンプ(実行日時)」が自動的に付与される(例:2026_05_28_120000_add_age_to_users.php)。これにより、複数のファイルが増えても「どの変更が先か」という順序(バージョン履歴)が時刻で管理される。チームで同時に開発するとき、タイムスタンプの順番に従って全員が同じ順序でマイグレーションを実行できるため、「どちらのファイルを先に適用すればよいか」という混乱が起きない。

AIコーディングとの関係

データベース設計を変更する際、AIに適切なマイグレーションコードを書いてもらうことで、各フレームワーク独自のデータベース操作の文法(API)を調べる手間をなくし、記述ミスを防ぐことができる。

  • マイグレーションファイルの生成指示:
    AIに対して、「Laravelで、postsテーブルに文字列型のcategoryカラムを追加し、必要なくなったsub_titleカラムを削除するマイグレーションファイルのコードを書いて。updownの両方のメソッドを含めてください」と指示する。
    これにより、フレームワークのルールに沿った正確な移行コードが即座に生成される。
  • データの安全性に配慮した設計の相談:
    本番環境のデータベースを変更する際、すでにデータが入っているテーブルからカラムを削除したり、データ型を変更したりすると、保存済みのデータが破損するリスクがある。
    AIに「すでに1万件のデータが入っている本番DBのstatusカラムのデータ型を文字列から数値に変えたいです。データ損失のない安全なマイグレーションの手順を考えてください」と相談し、段階的な変更コードを提案させることで、本番トラブルを未然に防ぐことができる。

よくある勘違い

マイグレーションは「データの引っ越し(移行)」のことだけを指す?

そうではない。
元々の英語の「Migration(移住、移動)」から、古いシステムから新しいシステムへ「データを引っ越す作業」そのものをマイグレーションと呼ぶこともある(システムマイグレーション、データ移行)。
しかし、Webアプリ開発の日常会話で「マイグレーション」と言うときは、上記で解説した「データベースの設計図(テーブル構造)の変更・管理システム」を指すのが一般的である。混同しないように文脈で判断しよう。

マイグレーションコマンドを実行すると、既存のデータがすべて消えてしまう?

通常の追加や変更の実行(php artisan migrate など)では、既存のデータは保持されたまま、新しいカラムが追加されるだけであり、データは消えない。
しかし、データベースを完全に初期化して作り直すコマンド(migrate:fresh など)を実行すると、テーブルそのものが一度すべて削除(DROP)されて新規作成されるため、中に保存されていたすべてのテストデータは完全に消滅する。本番環境や共有環境で実行するコマンドを間違えると、大惨事になるため細心の注意が必要である。

マイグレーションとバックアップは同じもの?

異なる。
マイグレーションは「テーブル構造(スキーマ)をバージョン管理する仕組み」であり、データそのものを保存・復元する「バックアップ」とは目的が違う。マイグレーションのロールバックで「元の構造」に戻すことはできるが、そのときすでに保存されていたデータは必ずしも自動的に復元されない。データを守るためには、マイグレーションとは別に定期的なデータバックアップも行う必要がある。

まとめ

  • マイグレーションは、データベースのテーブル構造(設計図)の作成・変更履歴をコードで管理する仕組み。
  • Gitでの履歴管理が可能になり、チーム全員で同じデータベース構造を安全に保つことができる。
  • 変更を適用する「Up」と、元に戻す「Down」のセットで構成される。
  • 本番環境で実行する際は、データ消失を防ぐため実行するコマンドの種類に十分に注意する。

情報ソース

より詳しくAIに聞いてみよう

  • Ruby on RailsやLaravelで、新しくマイグレーションファイルを生成するコマンドと、それを適用(実行)するコマンドの一覧を教えてください。
  • マイグレーションで「ロールバック(rollback)」が機能する仕組みと、過去の特定のバージョンまでテーブル構造を巻き戻す手順を教えてください。
  • すでに本番稼働しているデータベースから、既存のデータを失うことなくカラムの名前を変更(リネーム)するマイグレーション手順と注意点を解説してください。
  • データベースのマイグレーションが途中で失敗した場合(コンフリクトやエラーなど)の、安全なリカバリー手順について教えてください。
  • マイグレーションと同時に、開発用のダミーデータや初期データをデータベースに投入する「シーダー(Seeder)」の役割と使い方を教えてください。