ダウンマイグレーションの生成
このガイドでは、指定されたマイグレーションファイルを元に戻すダウンマイグレーション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
コマンドで新しいマイグレーションを生成する必要があります。 - ダウンマイグレーションはデータベーススキーマを元に戻しますが、アップマイグレーションの一部として実行されるデータおよびアプリケーションコードへの他の変更は元に戻されません。たとえば、マイグレーション中にデータを変更するスクリプトがある場合、ダウンマイグレーションを実行してもこのデータは元に戻りません。
migrate diff
を使用して、マイグレーションファイルで手動で変更または追加されたSQLを元に戻すことはできません。ビューやトリガーなどのカスタム追加がある場合は、以下を行う必要があります。- 以下の手順に従ってダウンマイグレーションを作成する
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
を使用します。- 新しく編集されたスキーマから
- 最後のマイグレーション後のスキーマの状態へ
そして、これをSQLスクリプト
down.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
これにより、新しい
<timestamp>_add_profile
ディレクトリがprisma/migrations
ディレクトリ内に作成され、その中に新しい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