開発と本番環境
このページでは、開発環境と本番環境でPrisma Migrateコマンドを使用する方法について説明します。
開発環境
開発環境では、migrate dev
コマンドを使用してマイグレーションを生成および適用します。
npx prisma migrate dev
マイグレーションの作成と適用
migrate dev
は開発用のコマンドであり、本番環境では絶対に使用しないでください。
このコマンドは以下を実行します:
- スキーマのずれ(編集または削除されたマイグレーションファイル、またはデータベーススキーマへの手動変更)を検出するために、シャドウデータベースで既存のマイグレーション履歴を再実行します。
- シャドウデータベースに保留中のマイグレーションを適用します(例:同僚によって作成された新しいマイグレーション)。
- Prismaスキーマに変更が検出された場合、これらの変更から新しいマイグレーションを生成します。
- 未適用のすべてのマイグレーションを開発データベースに適用し、
_prisma_migrations
テーブルを更新します。 - アーティファクト(例:Prisma Client)の生成をトリガーします。
migrate dev
コマンドは、以下のシナリオでデータベースのリセットを促します。
- 変更または欠落したマイグレーションによって引き起こされるマイグレーション履歴の競合。
- データベーススキーマがマイグレーション履歴の最終状態からずれている場合。
開発データベースをリセットする
手動での変更やdb push
の実験を取り消すために、データベースを自分でreset
することもできます。
npx prisma migrate reset
migrate reset
は開発用のコマンドであり、本番環境では絶対に使用しないでください。
このコマンドは以下を実行します:
- 可能な場合、データベース/スキーマ¹を削除します。環境がデータベース/スキーマ¹の削除を許可しない場合は、ソフトリセットを実行します。
- データベース/スキーマ¹が削除された場合、同じ名前で新しいデータベース/スキーマ¹を作成します。
- すべてのマイグレーションを適用します。
- シードスクリプトを実行します。
¹ MySQLとMongoDBの場合、これはデータベースを指し、PostgreSQLとSQL Serverの場合はスキーマを、SQLiteの場合はデータベースファイルを指します。
注: 開発データベースのデータを必要なだけ頻繁に再作成するためのシンプルで統合された方法については、シーディングガイドを参照してください。
マイグレーションのカスタマイズ
マイグレーションを適用する前に変更する必要がある場合があります。たとえば、
- ブログ投稿のタグを
String[]
からTag[]
に変更するような、大規模なリファクタリングを導入したい場合。 - フィールドの名前を変更したい場合(デフォルトでは、Prisma Migrateは既存のフィールドを削除します)。
- 1対1リレーションの方向を変更したい場合。
- 部分インデックスやストアドプロシージャなど、Prismaスキーマ言語では表現できない機能を追加したい場合。
--create-only
コマンドを使用すると、マイグレーションを適用せずに作成できます。
npx prisma migrate dev --create-only
編集したマイグレーションを適用するには、再度prisma migrate dev
を実行します。
例については、マイグレーションのカスタマイズを参照してください。
チーム開発
本番環境とテスト環境
本番環境とテスト環境では、migrate deploy
コマンドを使用してマイグレーションを適用します。
npx prisma migrate deploy
注:
migrate deploy
は通常、自動化されたCI/CDパイプラインの一部であるべきであり、本番データベースに変更をデプロイするためにこのコマンドをローカルで実行することは推奨しません。
このコマンドは以下を実行します:
-
適用されたマイグレーションをマイグレーション履歴と比較し、いずれかのマイグレーションが変更されている場合は警告します。
WARNING The following migrations have been modified since they were applied:
20210313140442_favorite_colors -
保留中のマイグレーションを適用します。
migrate deploy
コマンドは、
- 既に適用されたマイグレーションがマイグレーション履歴から欠落している場合でも警告を発行しません。
- スキーマのずれ(本番データベーススキーマがマイグレーション履歴の最終状態と異なる場合 - 例:ホットフィックスによるもの)を検出しません。
- データベースのリセットやアーティファクト(Prisma Clientなど)の生成を行いません。
- シャドウデータベースに依存しません。
参照
アドバイザリロック
Prisma Migrateは、以下のような本番環境コマンドを実行する際にアドバイザリロックを使用します。
prisma migrate deploy
prisma migrate dev
prisma migrate resolve
この安全策により、複数のコマンドが同時に実行されることを防ぎます。たとえば、2つのプルリクエストを短時間で連続してマージする場合などです。
アドバイザリロックには**10秒のタイムアウト**があり(設定不可)、基盤となるプロバイダーで利用可能なデフォルトのアドバイザリロックメカニズムを使用します。
Prisma Migrateのアドバイザリロックの実装は、壊滅的なエラーを回避するためだけのものであり、コマンドがタイムアウトした場合は、再度実行する必要があります。
5.3.0
以降、アドバイザリロックはPRISMA_SCHEMA_DISABLE_ADVISORY_LOCK
環境変数を使用して無効にできます。