lvncerpedia

ORM のマイグレーション

Next.jsとか触ってるなら、Prismaを例に出すのが一番イメージしやすいと思う!まかせて! 一言で言うと、マイグレーションは 「データベースの設計図(スキーマ)の変更履歴を管理してくれる超便利な仕組み」 だよ! Gitのデータベース版みたいな感じかな。

なんでマイグレーションが必要なの?

もしマイグレーションがなかったら…って想像してみて。

手作業でデータベースをいじる:

新しい機能のためにユーザーテーブルにageカラムを追加したい!ってなったら、データベースに直接ログインして「ALTER TABLE users ADD COLUMN age INTEGER;」みたいなSQL文を手で打たないといけない。 面倒だし、タイプミスしたら大惨事…

チーム開発で地獄を見る:

  • Aさん: 「よし、ageカラム追加しといたよー!」
  • Bさん: (それを知らずに古い設計図で開発)→「なんかエラー出るんだけど!?」
  • Cさん: 「あれ、このnicknameカラムって誰か追加した?本番環境にはある?」

…みたいに、誰がいつ何を変更したか分からなくなって、みんなのデータベースの状態がバラバラになっちゃうんだ。 こういう問題をぜーんぶ解決してくれるのがマイグレーションなんだよね!

Prismaだと、こうなる

Prismaを使ったときの流れを見ると、一発で「なるほど!」ってなるはず!

ステップ1:設計図を書く

まず、Prismaでは schema.prisma っていうファイルに、データベースの「こうなってほしい!」っていう理想の形(モデル)を書くよね。 これが唯一の正義の設計図になるんだ。

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
}

↑ 今はこんな感じ。シンプルだね!

ステップ2:設計図を変更する

ここで、「やっぱりユーザーに自己紹介文も持たせたいな〜」って思ったとする。 そしたら、このschema.prismaファイルを編集するだけ!

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  // ↓ この行を追加した!
  bio   String?
}

SQL文とかは一切書かなくてOK! ただモデルを書き換えるだけ。

ステップ3:魔法のコマンドを唱える

設計図を書き換えたら、ターミナルでこのコマンドを叩くんだ。

npx prisma migrate dev --name add_bio_to_user

このコマンドがマジで天才なの! こいつが何をしてくれるかというと…

差分を自動で検出

Prismaが今のデータベースの状態と、新しくなった schema.prisma を見比べて、「お、Userモデルにbioってカラムが追加されたな!」って差分を自動で見つけてくれる。

SQLファイルを自動生成

その差分を埋めるためのSQL文を勝手に書いてくれるんだ!こんな感じのファイルが新しく作られるよ。

-- migrations/20250913_add_bio_to_user/migration.sql

-- AlterTable
ALTER TABLE "User" ADD COLUMN "bio" TEXT;

このSQLファイルこそが 「マイグレーションファイル」 の正体! 「Userテーブルにbioカラムを追加する」っていう変更履歴が、コードとしてバッチリ記録されたわけ。 --name add_bio_to_user って付けた名前がフォルダ名になるから、後から見ても「ああ、ここでbioを追加したんだな」ってすぐわかる!

データベースに適用

生成したSQL文を、そのままデータベースに実行してくれる。 これで、実際のデータベースにもbioカラムが追加された!

Prisma Clientを更新

最後に、新しいデータベースの構造に合わせてPrisma Client(プログラムからDBを触るための道具)も更新してくれる。 至れり尽くせりだね!

マイグレーションの何が嬉しいの?まとめ

変更履歴が全部コードになる

マイグレーションファイルはただのテキストファイルだから、Gitでバージョン管理できる! これが一番大きいメリット! 「誰が」「いつ」「どんな目的で」データベースを変更したかが全部Gitの履歴に残るんだ。

チーム開発が超スムーズ

新しくプロジェクトに参加した人も、git pull して npx prisma migrate dev ってコマンドを一発叩けば、最新のデータベース構造が自分のPCにすぐ作れる! 「このカラム追加しといて!」みたいな口頭での伝言ゲームはもういらない!

安全で確実

手作業でSQLをいじる必要がないから、ヒューマンエラーが劇的に減る。 「本番環境だけに適用し忘れちゃった」みたいな事故も防げるよ。

つまり、マイグレーションは 「データベースのスキーマ変更を、安全かつ再現可能なコードとして管理するための仕組み」 ってこと!