心智模型
本指南提供了在使用关系型数据库时,关于 Prisma Migrate 数据库迁移的概念性概述。它涵盖了:数据库迁移是什么、它们的价值,以及 Prisma Migrate 是什么以及如何在不同环境中通过 Prisma Migrate 演进您的数据库 Schema。
如果您正在使用 MongoDB,请使用 prisma db push
来演进您的 Schema。
什么是数据库迁移?
数据库迁移是一组受控的更改,用于修改和演进数据库 Schema 的结构。迁移帮助您将数据库 Schema 从一种状态转换到另一种状态。例如,在迁移中,您可以创建或删除表和列,拆分表中的字段,或者为数据库添加类型和约束。
演进数据库 Schema 的模式
本节描述了演进数据库 Schema 的通用 Schema 迁移模式。
两种主要的 Schema 迁移模式是
- 模型/实体优先迁移:通过这种模式,您用代码定义数据库 Schema 的结构,然后使用迁移工具生成 SQL,例如,用于同步您的应用程序和数据库 Schema。
- 数据库优先迁移:通过这种模式,您定义数据库的结构并使用 SQL 将其应用于数据库。然后您会内省数据库以生成描述数据库结构的代码,从而同步您的应用程序和数据库 Schema。
注意
为简单起见,我们选择了上述术语来描述演进数据库 Schema 的不同模式。其他工具和库可能使用不同的术语来描述这些不同的模式。
迁移文件 (SQL) 理想情况下应与您的应用程序代码一起存储。它们还应在版本控制中进行跟踪,并与团队中其他从事该应用程序工作的人员共享。
迁移提供了状态管理,帮助您跟踪数据库的状态。
迁移还允许您在特定时间点复制数据库的状态,这在与团队其他成员协作时非常有用,例如在不同分支之间切换时。
有关数据库迁移的更多信息,请参阅 Prisma 数据指南。
什么是 Prisma Migrate?
Prisma Migrate 是一款数据库迁移工具,支持模型/实体优先的迁移模式,用于管理本地环境和生产环境中的数据库 Schema。
在您的项目中使用 Prisma Migrate 的工作流程将是迭代的,如下所示
本地开发环境(特性分支)
- 演进您的 Prisma Schema
- 使用
prisma migrate dev
或prisma db push
将您的 Prisma Schema 与本地开发数据库的数据库 Schema 同步
预览/暂存环境(特性拉取请求)
- 将您的更改推送到特性拉取请求
- 使用 CI 系统(例如 GitHub Actions)通过
prisma migrate deploy
将您的 Prisma Schema 和迁移历史与您的预览数据库同步
生产环境(主分支)
- 将您的应用程序代码从特性分支合并到主分支
- 使用 CI 系统(例如 GitHub Actions)通过
prisma migrate deploy
将您的 Prisma Schema 和迁移历史与您的生产数据库同步
Prisma Migrate 如何跟踪迁移状态
Prisma Migrate 使用以下状态要素来跟踪数据库 Schema 的状态
- Prisma Schema:您的真相来源,定义了数据库 Schema 的结构。
- 迁移历史:您
prisma/migrations
文件夹中的 SQL 文件,代表了对数据库 Schema 所做更改的历史记录。 - 迁移表:数据库中的
prisma_migrations
表,用于存储已应用于数据库的迁移的元数据。 - 数据库 Schema:数据库的状态。
使用 Prisma Migrate 时的要求
- 理想情况下,您应该为每个环境使用一个数据库。例如,您可能为开发、预览和生产环境分别设置一个独立的数据库。
- 您在开发环境中使用的数据库是一次性的——您可以根据需要轻松创建、使用和删除数据库。
- 每个环境中使用的数据库配置应保持一致。这对于确保某个迁移在整个工作流程中都能对数据库产生相同的更改非常重要。
- Prisma Schema 是您的真相来源——描述了您的数据库 Schema 的形态。
使用 Prisma Migrate 演进您的数据库 Schema
本节描述了如何使用 Prisma Migrate 在不同环境(开发、暂存和生产)中演进您的数据库 Schema。
开发环境中的 Prisma Migrate(本地)
使用 prisma migrate dev
跟踪您的迁移历史
prisma migrate dev
命令允许您跟踪对数据库所做的更改。prisma migrate dev
命令会自动生成 SQL 迁移文件(保存在 /prisma/migrations
中)并将其应用于数据库。当迁移应用于数据库时,数据库中的迁移表(_prisma_migrations
)也会更新。
prisma migrate dev
命令使用以下状态要素跟踪数据库的状态
- Prisma Schema
- 迁移历史
- 迁移表
- 数据库 Schema
注意:用于跟踪迁移状态的状态要素与Prisma Migrate 如何跟踪迁移状态一节中描述的相同。
您可以使用 --create-only
标志在将迁移应用于数据库之前对其进行自定义。例如,如果您想在不造成任何数据丢失的情况下重命名列,或者加载数据库扩展(在 PostgreSQL 中)和数据库视图(目前不支持),您可能需要编辑迁移。
在底层,Prisma Migrate 使用影子数据库来检测Schema 漂移并生成新的迁移。
注意:
prisma migrate dev
仅适用于使用一次性数据库的开发环境。
如果 prisma migrate dev
检测到 Schema 漂移或迁移历史冲突,系统将提示您重置(删除并重新创建您的数据库)您的数据库,以同步迁移历史和数据库 Schema。
展开查看卡通图解释的影子数据库
解决 Schema 漂移
Schema 漂移发生在预期数据库 Schema 与迁移历史中的内容不同时。例如,当您手动更新数据库 Schema 而没有相应地更新 Prisma Schema 和 prisma/migrations
时,就可能发生这种情况。
对于此类情况,您可以使用 prisma migrate diff
命令来比较您的迁移历史并回滚对数据库 Schema 所做的更改。
您可以使用 migrate diff
生成 SQL,它要么
- 回滚数据库 Schema 中所做的更改,使其与当前的 Prisma Schema 同步
- 将您的数据库 Schema 向前推进,以应用 Prisma Schema 和
/migrations
中缺失的更改
然后,您可以使用 prisma db execute
命令将更改应用于您的数据库。
原型化您的 Schema
prisma db push
命令允许您同步您的 Prisma Schema 和数据库 Schema,而无需持久化迁移(/prisma/migrations
)。prisma db push
命令使用以下状态要素跟踪数据库的状态
- Prisma Schema
- 数据库 Schema
prisma db push
命令在以下情况中很有用
- 您希望在本地快速原型化和迭代 Schema 设计,而无需将这些更改部署到其他环境,例如其他开发人员或暂存和生产环境。
- 您优先考虑达到期望的最终状态,而不是实现该最终状态所执行的更改或步骤(无法预览
prisma db push
所做的更改) - 您不需要控制 Schema 更改如何影响数据。无法编排 Schema 和数据迁移——如果
prisma db push
预期更改将导致数据丢失,您可以选择使用--accept-data-loss
选项接受数据丢失或停止该过程——无法自定义更改。
如果 prisma db push
命令检测到对数据库 Schema 的破坏性更改,它将提示您重置数据库。例如,当您向一个已存在内容的表添加必需字段但未提供默认值时,就会发生这种情况。
当您的数据库 Schema 与迁移历史和迁移表不同步时,就会发生Schema 漂移。
暂存和生产环境中的 Prisma Migrate
同步您的迁移历史
prisma migrate deploy
命令允许您将开发环境中的迁移历史与暂存或生产环境中的数据库同步。
在底层,migrate deploy
命令
- 比较已应用的迁移(捕获的
_prisma_migrations
)和迁移历史(/prisma/migrations
) - 应用待处理的迁移
- 使用新迁移更新
_prisma_migrations
表
该命令应在自动化 CI/CD 环境中运行,例如 GitHub Actions。
如果您没有迁移历史(/migrations
),即正在使用 prisma db push
,那么您将不得不继续在暂存和生产环境中使用 prisma db push
。请注意应用于数据库 Schema 的更改,因为其中一些可能具有破坏性。例如,prisma db push
无法判断您何时正在执行列重命名。它将提示进行数据库重置(删除并重新创建)。