メインコンテンツにスキップ

マイグレーション履歴について

このページでは、Prisma ORMがマイグレーション履歴を使用してスキーマの変更を追跡する方法について説明します。

マイグレーション履歴

マイグレーション履歴は、データモデルの変更の歴史であり、以下によって表されます。

  • 各マイグレーションのサブフォルダーとmigration.sqlファイルを含むprisma/migrationsフォルダー

    migrations/
    └─ 20210313140442_init/
    └─ migration.sql
    └─ 20210313140442_added_job_title/
    └─ migration.sql

    migrationsフォルダーは、データモデルの履歴に関する**信頼できる情報源**です。

  • データベース内の_prisma_migrationsテーブル。これは以下を確認するために使用されます。

    • マイグレーションがデータベースに対して実行されたかどうか
    • 適用されたマイグレーションが削除されたかどうか
    • 適用されたマイグレーションが変更されたかどうか

    マイグレーションを変更または削除した場合(**推奨されません**)、次のステップは、開発環境(したがってmigrate devを使用)または本番/テスト環境(したがってmigrate deployを使用)のどちらにいるかによって異なります。

適用済みのマイグレーションを編集または削除しないでください

一般的に、すでに適用されているマイグレーションを**編集または削除すべきではありません**。そうすることで、開発環境と本番環境のマイグレーション履歴の間で矛盾が生じ、予期せぬ結果につながる可能性があります。たとえ最初は何も問題がないように見えてもです。

次のシナリオは、一見無害な矛盾を引き起こす変更をシミュレートします。

  1. 開発環境で**すでに適用されている既存のマイグレーション**を変更し、VARCHAR(550)の値をVARCHAR(560)に変更します。
    ./prisma/migrations/20210310143435_default_value/migrations.sql
      -- AlterTable
    ALTER TABLE "Post" ALTER COLUMN "content" SET DATA TYPE VARCHAR(560);
    この変更を加えた後、マイグレーション履歴の最終状態はPrismaスキーマと一致しなくなります。Prismaスキーマには依然として@db.VarChar(550)があります。
  2. prisma migrate devを実行すると、マイグレーションが変更されたためエラーが発生し、データベースのリセットが提案されます。
  3. prisma migrate resetを実行します - Prisma Migrateはデータベースをリセットし、編集したマイグレーションを含むすべてのマイグレーションを再実行します。
  4. すべての既存のマイグレーションを適用した後、Prisma Migrateはマイグレーション履歴の最終状態をPrismaスキーマと比較し、不一致を検出します。
    • Prismaスキーマ:@db.VarChar(550)
    • データベーススキーマ:VARCHAR(560)
  5. Prisma Migrateは、マイグレーション履歴の最終状態がPrismaスキーマと一致する必要があるため、値を550に戻すための新しいマイグレーションを生成します。
  6. これ以降、prisma migrate deployを使用してマイグレーションを本番環境およびテスト環境にデプロイすると、Prisma Migrateはマイグレーション履歴が一致しないことを**常に警告します**(そしてコマンドを実行するたびに警告し続けます) - スキーマの最終状態が一致している場合でもです。
    6 migrations found in prisma/migrations
    WARNING The following migrations have been modified since they were applied:
    20210310143435_change_type

migrate reset後に何も問題がないように見える変更は、問題を隠蔽する可能性があります。開発環境では再現できないバグが本番環境で発生したり、その逆も起こり得ます。特に、変更が高度にカスタマイズされたマイグレーションに関する場合はそうです。

Prisma Migrateが、すでに適用されているマイグレーションの欠落または編集を報告した場合、リセットするのではなく、**根本原因**を修正する(ファイルを復元するか、変更を元に戻す)ことをお勧めします。

マイグレーション履歴をソース管理にコミットする

prisma/migrationsフォルダー全体をソース管理にコミットする必要があります。これには、プロバイダーの変更を試みたかどうかを検出するために使用されるprisma/migrations/migration_lock.tomlファイルが含まれます。

schema.prismaファイルをソース管理するだけでは不十分です。マイグレーション履歴を含める必要があります。これはなぜなら、

  • マイグレーションをカスタマイズするにつれて、マイグレーション履歴には**Prismaスキーマでは表現できない情報**が含まれるためです。たとえば、破壊的な変更によって引き起こされるデータ損失を軽減するためにマイグレーションをカスタマイズできます。
  • ステージング、テスト、および本番環境への変更をデプロイするために使用されるprisma migrate deployコマンドは、マイグレーションファイルのみを実行します。モデルを取得するためにPrismaスキーマを使用しません。