跳至主要内容

压缩迁移

本指南介绍如何将多个 迁移文件 压缩成单个迁移。

关于压缩迁移

有时将一些或所有迁移文件压缩成单个迁移很有用。本指南将介绍两种您可能需要执行此操作的场景

在这两种情况下,Prisma Migrate 都提供执行此操作的工具,通过使用 migrate diff 命令比较两个数据库模式并输出一个将您从一个状态带到另一个状态的单个 SQL 文件。本指南的其余部分将详细介绍如何在这些两种场景中执行此操作。

从开发环境干净迁移

在使用基于分支的工作流进行开发时,压缩迁移可能很有用。在对功能分支进行大量本地开发工作期间,您可能会使用 migrate dev 生成多个迁移。在功能完成之后,迁移历史记录中可能包含不必要的中间步骤,这些步骤在将要推送到 main 分支的最终迁移历史记录中是不需要的。

可能有一些重要的原因需要避免在生产环境中应用中间步骤——它们可能会丢失数据或速度极慢/具有破坏性)。即使不是这种情况,您也可能希望避免在生产环境的迁移历史记录中出现混乱。

有关如何使用 migrate dev 实现此操作的详细步骤,请参见 如何从开发环境干净迁移 部分。

在生产环境中创建干净的历史记录

压缩迁移也可用于生产环境,将所有迁移文件压缩成一个文件。当生产环境累积了较长的迁移历史记录时,这将非常有用,在新的环境中回放这些历史记录会变得很麻烦,因为中间步骤需要额外的时间。由于团队无法从迁移步骤中获得价值(并且可以在紧急情况下从版本控制历史记录中获取它们),因此决定将整个历史记录压缩成单个迁移。

有关如何使用 migrate diffmigrate resolve 实现此操作的详细步骤,请参见 如何在生产环境中创建干净的历史记录 部分。

压缩迁移时的注意事项

警告

压缩迁移时,请注意,migration.sql 文件中任何手动更改或添加的 SQL 不会保留。如果您有包含自定义添加项(例如视图或触发器)的迁移文件,请确保在压缩迁移后重新添加它们。

如何压缩迁移

本部分提供有关如何在上述两种场景中压缩迁移的分步说明

如何从开发环境干净迁移

压缩迁移之前,请确保您具有以下起始条件

  • 要压缩的迁移内容尚未应用到生产数据库
  • 应用到生产环境的所有迁移都已包含在本地迁移历史记录中
  • 您添加到分支中的任何新迁移文件中都没有自定义 SQL
信息

如果生产数据库上的迁移历史记录在您创建功能分支后发生了分歧,那么您需要先将生产环境的迁移历史记录和数据模型更改合并到您的本地历史记录中。

然后按照以下步骤操作

  1. 将本地 ./prisma/migrations 文件夹的内容重置为与 main 分支上的迁移历史记录匹配

  2. 创建新的迁移

    npx prisma migrate dev --name squashed_migrations

    这将创建一个单个迁移,它将您带到

    • main 分支的状态开始,如您重置的迁移历史记录中所述
    • 到您本地功能的状态,如 ./prisma/schema.prisma 文件中所述
    • 并将此输出到一个新的 migration.sql 文件,该文件位于以 squashed_migrations 结尾的新目录中(使用 --name 标志指定)

现在可以使用 migrate deploy 将此单个迁移文件应用到生产环境。

如何在生产环境中创建干净的历史记录

压缩迁移之前,请确保您具有以下起始条件

  • 生产数据库上应用了迁移历史记录中的所有迁移
  • 数据模型与迁移历史记录匹配
  • 数据模型和迁移历史记录同步

然后按照以下步骤操作,无论是在 main 分支上,还是在已检出的新分支上(在任何其他更改之前,将此分支合并回 main

  1. 删除 ./prisma/migrations 目录中的所有内容

  2. ./prisma/migrations 目录中创建一个新的空目录。在本指南中,它将被称为 000000000000_squashed_migrations。在这个目录中,添加一个新的空 migration.sql 文件。

    信息

    我们将迁移命名为 000000000000_squashed_migrations,并使用所有前导零,因为我们希望它成为迁移目录中的第一个迁移。Migrate 按字母顺序(字典顺序)运行目录中的迁移。这就是为什么在使用 migrate dev 时,它会使用日期和时间作为前缀生成迁移的原因。您可以为迁移指定其他名称,只要它比后面的迁移排序靠前,例如 0_squashed202207180000_squashed

  3. 创建一个单个迁移,它将您带到

    • 从空数据库开始
    • 到生产数据库模式的当前状态,如 ./prisma/schema.prisma 文件中所述
    • 并将此输出到上面创建的 migration.sql 文件

    您可以使用 migrate diff 命令执行此操作。从项目的根目录运行以下命令

    npx prisma migrate diff \
    --from-empty \
    --to-schema-datamodel ./prisma/schema.prisma \
    --script > ./prisma/migrations/000000000000_squashed_migrations/migration.sql
  4. 将此迁移标记为已在生产环境中应用,以防止它在生产环境中运行

    您可以使用 migrate resolve 命令将 000000000000_squashed_migrations 目录中的迁移标记为已应用

    npx prisma migrate resolve \
    --applied 000000000000_squashed_migrations

您现在应该有一个被标记为已在生产环境中应用的单个迁移文件。新的签出只得到一个将它们带到生产数据库模式状态的单个迁移。

生产数据库仍然包含迁移表中已应用迁移的历史记录。迁移文件夹和数据模型的历史记录也仍然存在于源代码控制中。