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

ダウンマイグレーションの生成

このガイドでは、指定されたマイグレーションファイルを元に戻すダウンマイグレーション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スキーマを出発点とします。

schema.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[]
}

対応するアップマイグレーションを作成する前に、まずダウンマイグレーションを作成する必要があります。

マイグレーションの生成

  1. アップマイグレーションに必要な変更を行うためにPrismaスキーマを編集します。この例では、新しいProfileモデルを追加します。

    schema.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 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?
    }
  2. ダウンマイグレーション用の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
  3. add_profileという名前でアップマイグレーションを生成して適用します。

    npx prisma migrate dev --name add_profile

    これにより、prisma/migrationsディレクトリ内に新しい<timestamp>_add_profileディレクトリが作成され、その中に新しいmigration.sqlアップマイグレーションファイルが格納されます。

  4. down.sqlファイルをアップマイグレーションファイルとともに新しいディレクトリにコピーします。

失敗したマイグレーションへのダウンマイグレーションの適用方法

前回のアップマイグレーションが失敗した場合、以下の手順で本番データベースにダウンマイグレーションを適用できます。

失敗したアップマイグレーション後に本番データベースにダウンマイグレーションを適用するには

  1. db executeを使用して、down.sqlファイルをデータベースサーバーで実行します。

    npx prisma db execute --file ./down.sql --schema prisma/schema.prisma
  2. migrate resolveを使用して、add_profileという名前のアップマイグレーションをロールバックしたことを記録します。

    npx prisma migrate resolve --rolled-back add_profile
© . All rights reserved.