跳到主要內容

產生向下遷移

本指南說明如何產生向下遷移 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。

作為範例,以下列具有 UserPost 模型的 Prisma schema 作為起點

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」狀態的潛在選項

    • 使用 --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