跳到主要内容

压缩迁移

本指南描述了如何将多个迁移文件压缩成一个迁移。

关于压缩迁移

有时,将部分或所有迁移文件压缩成一个迁移会很有用。本指南将介绍两种你可能需要这样做的场景

在这两种情况下,Prisma Migrate 都提供了实现此目的的工具,通过使用 migrate diff 命令比较两个数据库 schema 并输出一个单个 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 文件中描述的本地功能的状态
    • 并将其输出到以 squashed_migrations 结尾的新目录中的新 migration.sql 文件(通过 --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 文件中描述的生产数据库 schema 的当前状态
    • 并将其输出到上面创建的 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

你现在应该有一个标记为已应用于生产环境的单个迁移文件。新的检出将只获得一个将它们带到生产数据库 schema 状态的单个迁移。

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

© . All rights reserved.