跳到主要內容

生成回滾遷移

本指南介紹瞭如何生成一個回滾遷移 SQL 檔案,以撤銷給定的遷移檔案

關於回滾遷移

生成遷移 SQL 檔案時,你可能希望同時建立一個“回滾遷移”SQL 檔案,用於撤銷相應“正向遷移”檔案中的 Schema 更改。請注意,“回滾遷移”有時也被稱為“遷移回滾”。

本指南解釋瞭如何使用 Prisma Migrate 的 migrate diff 命令來建立回滾遷移,以及在正向遷移失敗的情況下,如何使用 db execute 命令將其應用到你的生產資料庫。

警告

本指南僅適用於為關係型資料庫生成 SQL 回滾遷移。它不適用於 MongoDB。

資訊

migrate diffdb execute 命令在 3.9.0 及更高版本中以預覽版提供,並在 3.13.0 及更高版本中普遍可用。

生成回滾遷移時的注意事項

生成回滾遷移檔案時,需要注意一些事項

  • 回滾遷移可用於在遷移失敗後使用如何將回滾遷移應用到失敗的遷移中的步驟來恢復資料庫 Schema。這需要使用 migrate resolve 命令,該命令只能用於失敗的遷移。如果你的正向遷移成功並希望將其回滾,則需要將 schema.prisma 檔案恢復到正向遷移之前的狀態,並使用 migrate dev 命令生成新的遷移。
  • 回滾遷移將恢復你的資料庫 Schema,但作為正向遷移一部分進行的資料和應用程式程式碼的其他更改將不會被恢復。例如,如果你有一個在遷移期間更改資料的指令碼,執行回滾遷移時這些資料將不會被改回。
  • 你將無法使用 migrate diff 來恢復遷移檔案中手動更改或新增的 SQL。如果你有任何自定義新增,例如檢視或觸發器,你需要
    • 按照以下說明建立回滾遷移
    • 使用 migrate dev --create-only 建立正向遷移,以便在將其應用到資料庫之前進行編輯
    • 手動將你的自定義 SQL 新增到正向遷移中(例如,新增檢視)
    • 手動將反向自定義 SQL 新增到回滾遷移中(例如,刪除檢視)

如何生成和執行回滾遷移

本節描述瞭如何生成回滾遷移 SQL 檔案以及相應的正向遷移,然後執行它以在生產環境中的正向遷移失敗後恢復資料庫 Schema。

例如,以下 Prisma Schema 以 UserPost 模型作為起點

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 Schema 以進行正向遷移所需的更改。在此示例中,你將新增一個新的 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 進行比較

    • 從新編輯的 Schema
    • 到上次遷移後 Schema 的狀態

    並將其輸出到 SQL 指令碼檔案 down.sql 中。

    指定“目標”狀態有兩種可選方案

    • 使用 --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:這會與資料庫的狀態進行比較。這不需要影子資料庫,但它依賴於資料庫具有最新的 Schema。要使用此選項,請執行

      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
© . This site is unofficial and not affiliated with Prisma Data, Inc.