ダウンマイグレーションの生成
このガイドでは、指定されたマイグレーションファイルを元に戻すダウンマイグレーション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