マイグレーション履歴について
このページでは、Prisma ORMがマイグレーション履歴を使用してスキーマの変更を追跡する方法について説明します。
マイグレーション履歴
マイグレーション履歴は、データモデルの変更の歴史であり、以下によって表されます。
-
各マイグレーションのサブフォルダーと
migration.sql
ファイルを含むprisma/migrations
フォルダーmigrations/
└─ 20210313140442_init/
└─ migration.sql
└─ 20210313140442_added_job_title/
└─ migration.sqlmigrations
フォルダーは、データモデルの履歴に関する**信頼できる情報源**です。 -
データベース内の
_prisma_migrations
テーブル。これは以下を確認するために使用されます。- マイグレーションがデータベースに対して実行されたかどうか
- 適用されたマイグレーションが削除されたかどうか
- 適用されたマイグレーションが変更されたかどうか
マイグレーションを変更または削除した場合(**推奨されません**)、次のステップは、開発環境(したがって
migrate dev
を使用)または本番/テスト環境(したがってmigrate deploy
を使用)のどちらにいるかによって異なります。
適用済みのマイグレーションを編集または削除しないでください
一般的に、すでに適用されているマイグレーションを**編集または削除すべきではありません**。そうすることで、開発環境と本番環境のマイグレーション履歴の間で矛盾が生じ、予期せぬ結果につながる可能性があります。たとえ最初は何も問題がないように見えてもです。
次のシナリオは、一見無害な矛盾を引き起こす変更をシミュレートします。
- 開発環境で**すでに適用されている既存のマイグレーション**を変更し、
VARCHAR(550)
の値をVARCHAR(560)
に変更します。./prisma/migrations/20210310143435_default_value/migrations.sqlこの変更を加えた後、マイグレーション履歴の最終状態はPrismaスキーマと一致しなくなります。Prismaスキーマには依然として-- AlterTable
ALTER TABLE "Post" ALTER COLUMN "content" SET DATA TYPE VARCHAR(560);@db.VarChar(550)
があります。 prisma migrate dev
を実行すると、マイグレーションが変更されたためエラーが発生し、データベースのリセットが提案されます。prisma migrate reset
を実行します - Prisma Migrateはデータベースをリセットし、編集したマイグレーションを含むすべてのマイグレーションを再実行します。- すべての既存のマイグレーションを適用した後、Prisma Migrateはマイグレーション履歴の最終状態をPrismaスキーマと比較し、不一致を検出します。
- Prismaスキーマ:
@db.VarChar(550)
- データベーススキーマ:
VARCHAR(560)
- Prismaスキーマ:
- Prisma Migrateは、マイグレーション履歴の最終状態がPrismaスキーマと一致する必要があるため、値を
550
に戻すための新しいマイグレーションを生成します。 - これ以降、
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スキーマを使用しません。