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

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

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

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を使用します。

    • 新しく編集されたスキーマから
    • 最後のマイグレーション後のスキーマの状態へ

    そして、これを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
  3. add_profileという名前でアップマイグレーションを生成して適用します。

    npx prisma migrate dev --name add_profile

    これにより、新しい<timestamp>_add_profileディレクトリがprisma/migrationsディレクトリ内に作成され、その中に新しい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