制限事項と既知の問題
Prisma Migrateには以下の制限事項が適用されます。
MongoDBコネクタはサポートされていません
Prisma Migrateは現在、MongoDBコネクタをサポートしていません。
データベースプロバイダを自動的に切り替えることはできません
Prisma Migrateは、お使いのプロバイダに特化したSQLファイルを生成します。これは、PostgreSQL用とSQLite用で同じマイグレーションファイルを使用できないことを意味します。なぜなら、マイグレーションの構文に互換性がないためです。
2.15.0以降では、Prisma Migrateはマイグレーションが設定されたプロバイダと一致しない場合を検出し、役立つエラーメッセージを出力します。たとえば、マイグレーションがPostgreSQLデータベース用なのにprovider
がmysql
に設定されている場合などです。
Error: P3014
The datasource provider `postgresql` specified in your schema does not match the one specified in the migration_lock.toml, mysql. Please remove your current migration directory and start a new migration history with prisma migrate dev.
データベースプロバイダを手動で切り替えるには、以下を行う必要があります。
- スキーマの
datasource
ブロックにあるprovider
とurl
パラメータを変更する - 既存のマイグレーション履歴をアーカイブまたは削除する (
./prisma/migrations
フォルダがないようにする) prisma migrate dev
を実行して、新しいマイグレーション履歴を開始する
最後のステップでは、空のデータベースから現在のschema.prisma
に至る新しい初期マイグレーションが作成されます。注意点として、
- このマイグレーションには、あなたの
schema.prisma
に反映されているもの のみ が含まれます。以前のマイグレーションファイルにカスタムSQLを手動で追加していた場合は、再度自分で追加する必要があります。 - 新しいプロバイダを使用して新しく作成されたデータベースには、データは含まれません。
データベースをリセットした際のデータ損失
開発環境では、Prisma Migrateがデータベースのリセットを促すことがあります。リセットはデータベースを削除して再作成するため、データ損失が発生します。データベースがリセットされるのは、以下のいずれかの場合です。
- 明示的に
prisma migrate reset
を呼び出した場合 prisma migrate dev
を呼び出し、Prisma Migrateがデータベース内のドリフトまたはマイグレーション履歴の競合を検出した場合
prisma migrate dev
および prisma migrate reset
コマンドは、開発環境でのみ 使用されるように設計されており、本番データに影響を与えるべきではありません。
データベースがリセットされると、Prisma Migrateがpackage.json
にシードスクリプトを検出した場合、シード処理をトリガーします。
注: データベースがリセットされた際にデータを再作成するシンプルで統合された方法については、シーディングガイドをご覧ください。
Prisma MigrateとPgBouncer
接続プーリングにPgBouncerを使用している環境でPrisma Migrateコマンドを実行しようとすると、以下のエラーが表示される場合があります。
Error: undefined: Database error
Error querying the database: db error: ERROR: prepared statement "s0" already exists
詳細情報と回避策については、Prisma MigrateとPgBouncerの回避策をご覧ください。更新情報については、GitHub issue #6485をフォローしてください。
非インタラクティブ環境でのPrisma Migrate
Prisma ORMは、CLIコマンドをDocker、Nodeスクリプト、またはbashシェルなどの非インタラクティブ環境で実行していることを検出します。この場合、環境が非インタラクティブであり、migrate dev
コマンドがサポートされていないことを示す警告が表示されます。
Docker環境がコマンドを認識するようにするには、interactive
モードでイメージを実行し、migrate dev
コマンドに反応するようにしてください。
docker run --interactive --tty <image name>
# or
docker -it <image name>
# Example usage
docker run -it node