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

開発と本番環境

このページでは、開発環境と本番環境で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 Schema Languageで表現できない機能を追加したい場合。

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