跳到主要内容

生成回滚迁移

本指南介绍了如何生成一个回滚迁移 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
© . All rights reserved.