如何升级
概述
本页帮助您就何时以及如何从 Prisma 1 升级到 Prisma ORM 2.x 及更高版本做出明智的决定。
升级文档
升级文档由几个页面组成,以下是如何使用它们的概述
- 如何升级(您在此处):了解总体升级过程的起点。
- 模式不兼容性:关于 Prisma 1 和 Prisma ORM 2.x(及更高版本)之间模式不兼容性的参考页面。阅读此页是可选的,但它将使您更好地理解升级过程中的某些步骤。
除了这两个页面外,还有各种实战指南,它们将引导您完成升级过程的示例场景
- 升级 Prisma 层:无论您的 Prisma 1 设置如何,您都应该始终通过遵循本指南来启动您的升级过程。
完成该指南后,您可以选择以下四个指南之一来升级您的应用层
- 旧版到新版 Nexus:如果您当前使用 GraphQL Nexus 运行 Prisma 1,请选择此指南。
- prisma-binding 到 Nexus:如果您当前使用
prisma-binding
运行 Prisma 1 并且想要升级到 Nexus,请选择此指南。 - prisma-binding 到 SDL 优先:如果您当前使用
prisma-binding
运行 Prisma 1 并且想要升级到 SDL 优先 GraphQL 服务器,请选择此指南。 - REST API:如果您当前使用 Prisma Client 1 运行 Prisma 1 并且正在构建 REST API,请选择此指南。
Prisma 1 和 Prisma ORM 2.x 及更高版本之间的主要区别
从高层来看,Prisma 1 和 Prisma ORM 2.x 及更高版本之间的最大区别总结如下。
Prisma ORM 2.x 及更高版本
- 不需要托管数据库代理服务器(即Prisma 服务器)。
- 使 Prisma 1 的功能更加模块化,并将其拆分为专用工具
- Prisma 客户端:Prisma 客户端 1.0 的改进版本
- Prisma Migrate:数据建模和迁移(以前的
prisma deploy
)。
- 使用Prisma 模式,它是 Prisma 1 数据模型和
prisma.yml
的合并。 - 使用自己的建模语言,而不是基于 GraphQL SDL。
- 不再暴露“数据库的 GraphQL API”,而只允许通过 Prisma 客户端 API 进行程序化访问。
- 不再支持 Prisma ORM 绑定。
- 允许通过更强大的内省将 Prisma ORM 2.x 及更高版本连接到任何现有数据库
特性对等
Prisma ORM 2.x 及更高版本尚未完全具有与 Prisma 1 的特性对等性。Prisma ORM 2.x 及更高版本仍然缺少的最大特性是实时订阅。
- 实时 API(订阅):Prisma ORM 2.x 及更高版本目前没有办法订阅数据库中发生的事件并实时收到通知。目前尚不清楚实时 API 是否、何时以及以何种形式添加到 Prisma ORM 2.x 及更高版本中。目前,您可以使用本机数据库触发器来实现实时功能,或者如果您使用 GraphQL 订阅,您可以考虑在mutation 解析器中手动触发订阅。
模式不兼容性
在 Prisma 1 中运行 prisma deploy
时创建的数据库模式仅与 Prisma ORM 2.x 及更高版本创建的数据库模式部分兼容。本节简要概述了常见的不兼容性以及潜在的解决方法。-
注意:有关问题和相应解决方法的详细说明,请参阅模式不兼容性页面。
以下是不同列的概述
- 问题:从 Prisma 1 升级到 Prisma ORM 2.x 及更高版本时的问题简短描述
- SQL:可以通过对 SQL 模式进行非破坏性更改来解决此问题吗?
- Prisma 模式:可以通过对 Prisma ORM 2.x 及更高版本中的模式进行非破坏性更改来解决此问题吗?
- 破坏 Prisma 1:SQL 语句是否破坏 Prisma 1 设置?这仅在您选择逐步并行升级策略时相关。
问题 | SQL | Prisma 模式 | 破坏 Prisma 1 |
---|---|---|---|
默认值未在数据库中表示 | 是 | 是 | 否 |
生成的 CUID 作为 ID 值未在数据库中表示 | 否 | 是 | 否 |
@createdAt 未在数据库中表示 | 是 | 是 | 否 |
@updatedAt 未在数据库中表示 | 否 | 是 | 否 |
内联 1-1 关系被识别为 1-n(缺少 UNIQUE 约束) | 是 | 否 | 否 |
所有非内联关系都被识别为 m-n | 是 | 否 | 是 |
Json 类型在数据库中表示为 TEXT | 是 | 否 | 否(MySQL) 是(PostgreSQL) |
枚举在数据库中表示为 TEXT | 是 | 否 | 否(MySQL) 是(PostgreSQL) |
必需的 1-1 关系未在数据库中表示 | 否 | 是 | 否 |
Prisma 1 中的 @db 属性未传输到 Prisma 模式 | 否 | 是 | 否 |
CUID 长度不匹配 | 是 | 否 | 否 |
标量列表(数组)使用额外的表进行维护 | 取决于 | 否 | 取决于 |
注意:Prisma 模式中解决方法的常见缺点是,在重新内省数据库后,对 Prisma 模式的更改会丢失,并且每次内省运行后都需要手动重新添加。