跳到主要内容

生成回滚迁移

本指南描述了如何生成一个回滚迁移 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”状态有两种潜在选项

    • 使用 --to-migrations:这将与 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

    这将创建一个新的 <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