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

開発と本番環境

このページでは、開発環境と本番環境でPrisma Migrateコマンドを使用する方法について説明します。

開発環境

開発環境では、migrate devコマンドを使用してマイグレーションを生成および適用します。

npx prisma migrate dev

マイグレーションの作成と適用

危険

migrate devは開発用のコマンドであり、本番環境では絶対に使用しないでください。

このコマンドは以下を実行します:

  1. スキーマのずれ(編集または削除されたマイグレーションファイル、またはデータベーススキーマへの手動変更)を検出するために、シャドウデータベースで既存のマイグレーション履歴を再実行します。
  2. シャドウデータベースに保留中のマイグレーションを適用します(例:同僚によって作成された新しいマイグレーション)。
  3. Prismaスキーマに変更が検出された場合、これらの変更から新しいマイグレーションを生成します。
  4. 未適用のすべてのマイグレーションを開発データベースに適用し、_prisma_migrationsテーブルを更新します。
  5. アーティファクト(例:Prisma Client)の生成をトリガーします。

migrate devコマンドは、以下のシナリオでデータベースのリセットを促します。

開発データベースをリセットする

手動での変更やdb pushの実験を取り消すために、データベースを自分でresetすることもできます。

npx prisma migrate reset
警告

migrate resetは開発用のコマンドであり、本番環境では絶対に使用しないでください。

このコマンドは以下を実行します:

  1. 可能な場合、データベース/スキーマ¹を削除します。環境がデータベース/スキーマ¹の削除を許可しない場合は、ソフトリセットを実行します。
  2. データベース/スキーマ¹が削除された場合、同じ名前で新しいデータベース/スキーマ¹を作成します。
  3. すべてのマイグレーションを適用します。
  4. シードスクリプトを実行します。

¹ MySQLとMongoDBの場合、これはデータベースを指し、PostgreSQLとSQL Serverの場合はスキーマを、SQLiteの場合はデータベースファイルを指します。

: 開発データベースのデータを必要なだけ頻繁に再作成するためのシンプルで統合された方法については、シーディングガイドを参照してください。

マイグレーションのカスタマイズ

マイグレーションを適用する前に変更する必要がある場合があります。たとえば、

  • ブログ投稿のタグをString[]からTag[]に変更するような、大規模なリファクタリングを導入したい場合。
  • フィールドの名前を変更したい場合(デフォルトでは、Prisma Migrateは既存のフィールドを削除します)。
  • 1対1リレーションの方向を変更したい場合。
  • 部分インデックスやストアドプロシージャなど、Prismaスキーマ言語では表現できない機能を追加したい場合。

--create-onlyコマンドを使用すると、マイグレーションを適用せずに作成できます。

npx prisma migrate dev --create-only

編集したマイグレーションを適用するには、再度prisma migrate devを実行します。

例については、マイグレーションのカスタマイズを参照してください。

チーム開発

参照:Prisma Migrateによるチーム開発

本番環境とテスト環境

本番環境とテスト環境では、migrate deployコマンドを使用してマイグレーションを適用します。

npx prisma migrate deploy

: migrate deployは通常、自動化されたCI/CDパイプラインの一部であるべきであり、本番データベースに変更をデプロイするためにこのコマンドをローカルで実行することは推奨しません。

このコマンドは以下を実行します:

  1. 適用されたマイグレーションをマイグレーション履歴と比較し、いずれかのマイグレーションが変更されている場合は警告します。

    WARNING The following migrations have been modified since they were applied:
    20210313140442_favorite_colors
  2. 保留中のマイグレーションを適用します。

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環境変数を使用して無効にできます。

© . All rights reserved.