跳至主要内容

生成向下迁移

本指南介绍如何生成一个向下迁移 SQL 文件,该文件会反转给定的 迁移文件

关于向下迁移

生成迁移 SQL 文件时,您可能希望也创建一个“向下迁移”SQL 文件,该文件会反转相应“向上迁移”文件中的模式更改。请注意,“向下迁移”有时也称为“迁移回滚”。

本指南说明如何使用 Prisma Migrate 的 migrate diff 命令 创建向下迁移,以及如何在向上迁移失败的情况下使用 db execute 命令将其应用于生产数据库。

警告

本指南仅适用于为关系数据库生成 SQL 向下迁移。它不适用于 MongoDB。

信息

migrate diffdb execute 命令在 3.9.0 及更高版本中处于预览阶段,并在 3.13.0 及更高版本中普遍可用。

生成向下迁移时的注意事项

生成向下迁移文件时,需要注意一些事项

  • 可以使用向下迁移在向上迁移失败后使用 如何将向下迁移应用于失败的迁移 中的步骤来还原数据库模式。这需要使用 migrate resolve 命令,该命令只能在失败的迁移上使用。如果您的向上迁移成功,并且您希望将其还原,则需要将 schema.prisma 文件还原到向上迁移之前的状态,并使用 migrate dev 命令生成新的迁移。
  • 向下迁移会还原您的数据库模式,但不会还原作为向上迁移的一部分执行的与数据和应用程序代码的其他更改。例如,如果您有一个在迁移期间更改数据的脚本,那么在运行向下迁移时,该数据将不会被更改回。
  • 您将无法使用 migrate diff 来还原迁移文件中手动更改或添加的 SQL。如果您有任何自定义添加,例如视图或触发器,则需要
    • 按照 以下说明 创建向下迁移
    • 使用 migrate dev --create-only 创建向上迁移,以便在将其应用于数据库之前对其进行编辑
    • 将您的自定义 SQL 手动添加到向上迁移中(例如,添加视图)
    • 将反转的自定义 SQL 手动添加到向下迁移中(例如,删除视图)

如何生成和运行向下迁移

本节介绍如何在生产环境中生成与相应的向上迁移一起的向下迁移 SQL 文件,然后在向上迁移失败后运行该文件以还原您的数据库模式。

例如,以具有 UserPost 模型的以下 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-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

    这将在 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