压缩迁移
本指南介绍了如何将多个 迁移文件 压缩成单个迁移。
关于压缩迁移
有时将部分或全部迁移文件压缩成单个迁移非常有用。本指南将介绍您可能想要执行此操作的两种情况
- 从开发环境干净地迁移,方法是在合并之前将本地迁移压缩为一个
- 在生产环境中创建干净的历史记录,方法是将所有迁移压缩成单个文件
在这两种情况下,Prisma Migrate 都提供了执行此操作的工具,即使用 migrate diff
命令来比较两个数据库 schema,并输出一个 SQL 文件,该文件将您从一个 schema 迁移到另一个 schema。本指南的其余部分提供了关于如何在两种情况下执行此操作的详细说明。
从开发环境干净地迁移
当使用基于分支的工作流程进行开发时,压缩迁移可能很有用。在功能分支上进行大型本地开发工作期间,您可能会使用 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 状态的单个迁移。
生产数据库仍然包含迁移表中已应用迁移的历史记录。迁移文件夹和数据模型的历史记录也仍然在源代码控制中可用。