合并迁移
本指南介绍了如何将多个迁移文件合并为一个迁移。
关于合并迁移
有时,将部分或所有迁移文件合并为一个迁移会很有用。本指南将介绍两种可能需要这样做的场景:
- 从开发环境干净地迁移,即在合并之前将本地迁移合并为一个。
- 在生产环境中创建干净的历史记录,即通过将所有迁移合并到一个文件中。
在这两种情况下,Prisma Migrate 都提供了实现这些目标的方法,即使用 migrate diff 命令比较两个数据库 schema 并输出一个 SQL 文件,将它们从一个状态转换为另一个状态。本指南的其余部分将详细说明如何在这两种场景中执行此操作。
从开发环境干净地迁移
在基于分支的工作流中进行开发时,合并迁移会很有用。在功能分支上进行大量的本地开发工作时,您可能会使用 migrate dev 生成多个迁移。功能完成后,迁移历史记录可能包含不必要的中间步骤,这些中间步骤是推送到 main 分支的最终迁移历史记录中不想要的。
有重要原因需要避免在生产环境中应用中间步骤——它们可能会丢失数据或非常缓慢/具有破坏性)。即使没有这种情况,您也可能希望避免生产环境的迁移历史记录中出现混乱。
有关如何使用 migrate dev 实现此目标的详细步骤,请参阅如何从开发环境干净地迁移一节。
在生产环境中创建干净的历史记录
合并迁移也可以在生产环境中使用,将所有迁移文件合并为一个。当生产环境积累了更长的迁移历史记录,并且由于中间步骤需要额外时间,在新环境中重放它已成为负担时,这会很有用。由于团队没有从迁移步骤中获得价值(并且可以在紧急情况下从版本控制历史记录中找回它们),因此决定将整个历史记录合并为一个迁移。
有关如何使用 migrate diff 和 migrate resolve 实现此目标的详细步骤,请参阅如何在生产环境中创建干净的历史记录一节。
合并迁移时的注意事项
合并迁移时,请注意 migration.sql 文件中任何手动更改或添加的 SQL 将不会保留。如果您的迁移文件包含视图或触发器等自定义添加内容,请确保在合并迁移后重新添加它们。
如何合并迁移
本节提供了关于如何在上述两种场景中合并迁移的分步说明。
如何从开发环境干净地迁移
在合并迁移之前,请确保满足以下起始条件:
- 要合并的迁移内容尚未应用于生产数据库
- 已应用于生产环境的所有迁移都已是本地迁移历史的一部分
- 您已添加到分支中的任何新迁移文件中没有自定义 SQL
如果生产数据库上的迁移历史在您创建功能分支后发生了分歧,那么您需要首先将生产环境的迁移历史和数据模型更改合并到您的本地历史中。
然后按照以下步骤操作:
-
将本地
./prisma/migrations文件夹的内容重置为与main分支上的迁移历史匹配 -
创建新的迁移
npx prisma migrate dev --name squashed_migrations这将创建一个单独的迁移,带您从以下状态:
- 由您重置的迁移历史描述的
main分支状态 - 到您的
./prisma/schema.prisma文件描述的本地功能状态 - 并将此输出到一个新目录中新的
migration.sql文件中,该目录以squashed_migrations结尾(通过--name标志指定)
- 由您重置的迁移历史描述的
这个单一的迁移文件现在可以使用 migrate deploy 应用到生产环境。
如何在生产环境中创建干净的历史记录
在合并迁移之前,请确保满足以下起始条件:
- 迁移历史中的所有迁移都已应用于生产数据库
- 数据模型与迁移历史匹配
- 数据模型和迁移历史是同步的
然后执行以下步骤,可以在您的 main 分支上执行,也可以在一个新检出的分支上执行,该分支在其他任何更改之前合并回 main
-
删除
./prisma/migrations目录的所有内容 -
在
./prisma/migrations目录中创建一个新的空目录。在本指南中,它将被称为000000000000_squashed_migrations。在此目录中,添加一个新的空migration.sql文件。信息我们将迁移命名为
000000000000_squashed_migrations,并带上所有的前导零,因为我们希望它是迁移目录中的第一个迁移。Migrate 以字典(字母)顺序运行目录中的迁移。这就是为什么在使用migrate dev时,它会生成带有日期和时间作为前缀的迁移。您可以给迁移另一个名称,只要它比后续的迁移排序靠前,例如0_squashed或202207180000_squashed。 -
创建一个单一的迁移,带您从以下状态:
- 一个空的数据库
- 到您的
./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 -
将此迁移标记为已在生产环境中应用,以防止它在那里运行
您可以使用
migrate resolve命令将000000000000_squashed_migrations目录中的迁移标记为已应用npx prisma migrate resolve \
--applied 000000000000_squashed_migrations
您现在应该有一个已标记为已在生产环境中应用的单一迁移文件。新的检出将只获得一个单一的迁移,使其达到生产数据库 schema 的状态。
生产数据库仍然在迁移表中包含已应用迁移的历史记录。迁移文件夹和数据模型的历史记录也仍然可以在源代码管理中找到。