ダウンマイグレーションの生成
このガイドでは、指定されたマイグレーションファイルを元に戻すダウンマイグレーションSQLファイルを生成する方法について説明します。
ダウンマイグレーションについて
マイグレーションSQLファイルを生成する際、対応する「アップマイグレーション」ファイルでのスキーマ変更を元に戻す「ダウンマイグレーション」SQLファイルも作成したい場合があります。「ダウンマイグレーション」は「マイグレーションのロールバック」とも呼ばれる場合があることに注意してください。
このガイドでは、Prisma Migrateのmigrate diffコマンドを使用してダウンマイグレーションを作成する方法、およびアップマイグレーションが失敗した場合にdb executeコマンドで本番データベースに適用する方法について説明します。
このガイドは、リレーショナルデータベース用のSQLダウンマイグレーションの生成にのみ適用されます。MongoDBには適用されません。
migrate diffコマンドとdb executeコマンドは、バージョン3.9.0以降でプレビュー版として利用可能であり、バージョン3.13.0以降では一般提供されています。
ダウンマイグレーション生成時の考慮事項
ダウンマイグレーションファイルを生成する際には、いくつか考慮すべき点があります。
- ダウンマイグレーションは、失敗したマイグレーションへのダウンマイグレーションの適用方法の手順を使用して、失敗したマイグレーション後にデータベーススキーマを元に戻すために使用できます。これには、失敗したマイグレーションにのみ使用できる
migrate resolveコマンドの使用が必要です。アップマイグレーションが成功し、それを元に戻したい場合は、schema.prismaファイルをアップマイグレーション前の状態に戻し、migrate devコマンドで新しいマイグレーションを生成する必要があります。 - ダウンマイグレーションはデータベーススキーマを元に戻しますが、アップマイグレーションの一部として実行されるデータやアプリケーションコードへの他の変更は元に戻されません。たとえば、マイグレーション中にデータを変更するスクリプトがある場合、ダウンマイグレーションを実行してもこのデータは元に戻りません。
- マイグレーションファイル内で手動で変更または追加されたSQLを元に戻すために
migrate diffを使用することはできません。ビューやトリガーなどのカスタム追加がある場合は、次の操作を行う必要があります。- 以下の手順に従ってダウンマイグレーションを作成する
migrate dev --create-onlyを使用してアップマイグレーションを作成し、データベースに適用する前に編集できるようにする- 手動でカスタムSQLをアップマイグレーションに追加する(例: ビューの追加)
- 手動で反転したカスタムSQLをダウンマイグレーションに追加する(例: ビューの削除)
ダウンマイグレーションの生成と実行方法
このセクションでは、対応するアップマイグレーションとともにダウンマイグレーションSQLファイルを生成する方法、および本番環境で失敗したアップマイグレーション後にデータベーススキーマを元に戻すためにそれを実行する方法について説明します。
例として、UserおよびPostモデルを持つ次のPrismaスキーマを出発点とします。
model Post {
id Int @id @default(autoincrement())
title String @db.VarChar(255)
content String?
author User @relation(fields: [authorId], references: [id])
authorId Int
}
model User {
id Int @id @default(autoincrement())
name String?
posts Post[]
}
対応するアップマイグレーションを作成する前に、まずダウンマイグレーションを作成する必要があります。
マイグレーションの生成
-
アップマイグレーションに必要な変更を行うためにPrismaスキーマを編集します。この例では、新しい
Profileモデルを追加します。schema.prismamodel Post {
id Int @id @default(autoincrement())
title String @db.VarChar(255)
content String?
author User @relation(fields: [authorId], references: [id])
authorId Int
}
model Profile {
id Int @id @default(autoincrement())
bio String?
user User @relation(fields: [userId], references: [id])
userId Int @unique
}
model User {
id Int @id @default(autoincrement())
name String?
posts Post[]
profile Profile?
} -
ダウンマイグレーション用のSQLファイルを生成します。これを行うには、
migrate diffを使用して比較を行います。- 新しく編集されたスキーマから
- 最後のマイグレーション後のスキーマの状態へ
そしてこれを
down.sqlというSQLスクリプトに出力します。'to'の状態を指定するための2つの潜在的なオプションがあります。
-
--to-migrationsの使用: これは、マイグレーションディレクトリに与えられたマイグレーションの状態と比較を行います。これはより堅牢であるため推奨されるオプションですが、シャドウデータベースが必要です。このオプションを使用するには、以下を実行します。npx prisma migrate diff \
--from-schema-datamodel prisma/schema.prisma \
--to-migrations prisma/migrations \
--shadow-database-url $SHADOW_DATABASE_URL \
--script > down.sql -
--to-schema-datasourceの使用: これはデータベースの状態と比較を行います。これにはシャドウデータベースは必要ありませんが、データベースが最新のスキーマを持っていることに依存します。このオプションを使用するには、以下を実行します。npx prisma migrate diff \
--from-schema-datamodel prisma/schema.prisma \
--to-schema-datasource prisma/schema.prisma \
--script > down.sql
-
add_profileという名前でアップマイグレーションを生成して適用します。npx prisma migrate dev --name add_profileこれにより、
prisma/migrationsディレクトリ内に新しい<timestamp>_add_profileディレクトリが作成され、その中に新しいmigration.sqlアップマイグレーションファイルが格納されます。 -
down.sqlファイルをアップマイグレーションファイルとともに新しいディレクトリにコピーします。
失敗したマイグレーションへのダウンマイグレーションの適用方法
前回のアップマイグレーションが失敗した場合、以下の手順で本番データベースにダウンマイグレーションを適用できます。
失敗したアップマイグレーション後に本番データベースにダウンマイグレーションを適用するには
-
db executeを使用して、down.sqlファイルをデータベースサーバーで実行します。npx prisma db execute --file ./down.sql --schema prisma/schema.prisma -
migrate resolveを使用して、add_profileという名前のアップマイグレーションをロールバックしたことを記録します。npx prisma migrate resolve --rolled-back add_profile