Closed3

開発環境のデータを消さずにPrismaのmigration.sqlをスカッシュしてまとめる

かめっちかめっち

はじめに

Prisma を使った開発中に、複数のマイグレーションファイルが積み重なると管理が面倒になる。
開発環境の既存データを保持しつつ、古いマイグレーションを “スカッシュ” して1つにまとめる手順をメモする。

前提

  • 開発中にPrismaのモデルに微修正を複数回加えてprisma migrate devした。
  • デプロイ前にmigration.sqlを一つにスカッシュしたい。
  • ここで普通にもう一度prisma migrate devすると開発環境のデータを消すか聞かれるが、今回は既存データを保持したい。
かめっちかめっち

前提

スカッシュ前の状態

おそらくお手元の環境は以下のようになっている、と仮定する。

  1. Prismaモデルを追加した
    model User {
      id              Int      @id @default(autoincrement())
      avatarURL       String?
    }
    
  2. prisma migrate devしてmigration①が生成された
    prisma\migrations\20250601094533_add_user_model\migration.sql
    CREATE TABLE `User` (
        `id` INTEGER NOT NULL AUTO_INCREMENT,
        `avatarURL` VARCHAR(191) NULL,
    ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  3. Prismaモデルにメンバーを追加した
    model User {
      id              Int      @id @default(autoincrement())
      avatarURL       String?
    +  memberAvatarURL String?
    }
    
  4. もう一回prisma migrate devするとmigration②が生成され、差分か書き込まれる
    prisma\migrations\20250605000735_add_member_avatar_url\migration.sql
    ALTER TABLE `User` ADD COLUMN `memberAvatarURL` VARCHAR(191);
    

理想

この状態では、migration.sqlが2つになっている。
これだと何回も少しずつモデルを修正したことがバレて恥ずかしいので、デプロイする前に以下のように1つにまとめておきたい。

prisma\migrations\20250601094533_add_user_model\migration.sql
CREATE TABLE `User` (
    `id` INTEGER NOT NULL AUTO_INCREMENT,
    `avatarURL` VARCHAR(191) NULL,
    `memberAvatarURL` VARCHAR(191) NULL,
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
かめっちかめっち

解決手順

  1. まずは手動でmigration①にmigration②の内容をマージする。
    prisma\migrations\20250601094533_add_user_model\migration.sql
    CREATE TABLE `User` (
        `id` INTEGER NOT NULL AUTO_INCREMENT,
        `avatarURL` VARCHAR(191) NULL,
    +    `memberAvatarURL` VARCHAR(191) NULL,
    ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  2. migration②は削除する。
  3. 開発環境のDBの_prisma_migrationsテーブルをSQLエディタで開く。
  4. migration①のmigration_nameを控えておく。
    • 今回は 20250601094533_add_user_model
  5. _prisma_migrationsのmigration①と②のレコードを削除する
    HiediSQLでの操作
    SQL手打ちの場合以下のように消す
    DELETE FROM _prisma_migrations WHERE migration_name="20250601094533_add_user_model";
    DELETE FROM _prisma_migrations WHERE migration_name="20250605000735_add_member_avatar_url";
    
  6. prisma resolveコマンドにて「適用済み」としてマーク
    手順4で控えたマイグレーション名を指定する。
    npx prisma migrate resolve --applied 20250601094533_add_user_model
    
  7. prisma migrate devコマンドを打って問題ないことを確認
    > npx prisma migrate dev
    Environment variables loaded from .env
    Prisma schema loaded from prisma\schema.prisma
    Datasource "db": MySQL database "s64_event" at "localhost:3306"
    
    Already in sync, no schema change or pending migration was found.
    
    ✔ Generated Prisma Client (v6.5.0) to .\node_modules\@prisma\client in 165ms
    
このスクラップは3ヶ月前にクローズされました