跳到主内容

如何升级

概述

本页帮助您了解何时以及如何从 Prisma 1 升级到 Prisma ORM 2.x 及更高版本,并做出明智的决定。

升级文档

升级文档包含多个页面,以下是使用这些页面的概述

  • 如何升级 (您在这里): 了解升级过程的起点。
  • Schema 不兼容性: 关于 Prisma 1 与 Prisma ORM 2.x(及更高版本)之间 schema 不兼容性的参考页面。阅读此页面是可选的,但能让您更好地理解升级过程中的某些步骤。

除了这两个页面外,还有各种实用指南,它们将引导您完成升级过程中的示例场景

  • 升级 Prisma 层: 无论您的 Prisma 1 设置如何,您都应始终从遵循本指南开始升级过程

完成该指南后,您可以选择以下四个指南之一来升级您的应用层

  • 旧版到新版 Nexus: 如果您当前正在使用 Prisma 1 和 GraphQL Nexus,请选择此指南。
  • prisma-binding 到 Nexus: 如果您当前正在使用 Prisma 1 和 prisma-binding 并想升级到 Nexus,请选择此指南。
  • prisma-binding 到 SDL-first: 如果您当前正在使用 Prisma 1 和 prisma-binding 并想升级到 SDL-first GraphQL 服务器,请选择此指南。
  • REST API: 如果您当前正在使用 Prisma Client 1 构建 REST API,请选择此指南。

Prisma 1 与 Prisma ORM 2.x 及更高版本之间的主要区别

总的来说,Prisma 1 与 Prisma ORM 2.x 及更高版本之间的最大区别总结如下。

Prisma ORM 2.x 及更高版本

  • 不需要托管数据库代理服务器(即 Prisma 服务器)。
  • 将 Prisma 1 的特性模块化,并拆分为专用工具
    • Prisma Client: Prisma Client 1.0 的改进版本。
    • Prisma Migrate: 数据建模和迁移(以前是 prisma deploy)。
  • 使用 Prisma schema,它是 Prisma 1 datamodel 和 prisma.yml 的合并。
  • 使用自己的 建模语言,而不是基于 GraphQL SDL。
  • 不再公开“数据库的 GraphQL API”,而只允许通过 Prisma Client API 进行编程访问
    • 不再支持 Prisma ORM binding。
  • 通过更强大的内省功能,允许将 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 订阅,可以考虑在变更解析器内部手动触发订阅。

Schema 不兼容性

在 Prisma 1 中运行 prisma deploy 时创建的数据库 schema 与 Prisma ORM 2.x 及更高版本创建的 schema 仅部分兼容。本节快速概述了常见的不兼容性以及可能的解决方法。

注意: 有关问题和相应解决方法的详细说明,请参阅Schema 不兼容性页面。

以下是不同列的概述

  • 问题: 升级到 Prisma ORM 2.x 及更高版本时问题的简要描述。
  • SQL: 能否通过对 SQL schema 进行非破坏性更改来解决?
  • Prisma schema: 能否通过对 Prisma ORM 2.x 及更高版本中的 schema 进行非破坏性更改来解决?
  • 破坏 Prisma 1: SQL 语句是否会破坏 Prisma 1 设置?这仅在您选择渐进式并行升级策略时才相关。
问题SQLPrisma schema破坏 Prisma 1
默认值未在数据库中体现
生成的 CUID 作为 ID 值未在数据库中体现
@createdAt 未在数据库中体现
@updatedAt 未在数据库中体现
内联的 1 对 1 关系被识别为 1 对多(缺少 UNIQUE 约束)
所有非内联关系都被识别为多对多
Json 类型在数据库中表示为 TEXT否 (MySQL)
是 (PostgreSQL)
枚举在数据库中表示为 TEXT否 (MySQL)
是 (PostgreSQL)
必需的 1 对 1 关系未在数据库中体现
Prisma 1 的 @db 属性未迁移到 Prisma schema
CUID 长度不匹配
标量列表(数组)通过额外的表维护取决于情况取决于情况

注意: Prisma schema 中解决方法的普遍缺点是,在重新内省数据库后,对 Prisma schema 的更改会丢失,需要在每次内省运行后手动重新添加。

Prisma 1 Upgrade CLI

Prisma 1 Upgrade CLI 帮助您应用Schema 不兼容性页面中解释的解决方法。它生成 SQL 语句来修复数据库 schema,使其与 Prisma ORM 2.x 及更高版本兼容。请注意,您可以完全控制对数据库执行的操作,Upgrade CLI 只为您生成并打印语句。Upgrade CLI 还负责处理 Prisma schema 中的解决方法。

总体而言,使用 Upgrade CLI 的升级流程如下。

对于初始设置

  1. 您通过安装 Prisma ORM 2.x 及更高版本的 CLI 并运行 npx prisma init 来设置 Prisma ORM。
  2. 您连接到数据库并使用 npx prisma db pull 进行内省。

Prisma CLI introspection flow

对于修复 schema 不兼容性

  1. 您使用 npx prisma-upgrade 调用 Upgrade CLI。
  2. Upgrade CLI 为您生成要在数据库上运行的 SQL 命令。
  3. 您在数据库上运行 SQL 命令。
  4. 您再次运行 prisma db pull 命令。
  5. 您再次运行 npx prisma-upgrade 命令。
  6. Upgrade CLI 通过添加缺失的属性来调整 Prisma schema(2.x 及更高版本)。

Fixing the schema incompatibilities

请注意,Upgrade CLI 的设计方式是您可以随时停止和重新开始该过程。一旦您在数据库上运行了由 Upgrade CLI 生成的 SQL 命令,下次调用 Upgrade CLI 时,该 SQL 命令将不会再次出现。这样,您就可以在方便时逐步解决所有 schema 不兼容性。

升级策略

有两种主要的升级策略

  • 一次性全部升级: 完全从项目中移除 Prisma 1,并将所有内容一次性迁移到 Prisma ORM 2.x 或更高版本。
  • 渐进式并行升级: 将 Prisma ORM 2.x 及更高版本添加到现有的 Prisma 1 项目中,并逐步用新的 Prisma 特性替换现有的 Prisma 1 特性,同时让它们并行运行。

请注意,如果您计划让 Prisma 1 和 Prisma ORM 2.x 或更高版本并行运行,则此时不得解决会破坏 Prisma 1 设置的schema 兼容性问题。

何时选择哪种策略

如果您的项目尚未投入生产或流量和用户数据很少,建议采用一次性全部升级策略。

如果您的项目已经有大量流量且数据库中存储了大量用户数据,您可能需要考虑渐进式升级策略,即让 Prisma 1 和 Prisma ORM 2 或更高版本并行运行一段时间,直到您用 Prisma ORM 2 或更高版本替换所有旧的 Prisma 1 功能。

请注意,如果您选择渐进式升级策略并打算让 Prisma 1 和 Prisma ORM 2.x 或更高版本并行运行,则无法修复需要“破坏 Prisma 1”更改的schema 不兼容性问题。这是因为这些数据迁移会破坏 Prisma 1 期望的 schema。这意味着您的 Prisma Client API 可能不像本来那样符合习惯用法,但您仍然可以使用 Prisma Client 的全部功能。

升级路径

无论您选择哪种策略,总的来说,设想的升级路径如下所示

  1. 安装新的 Prisma ORM 2.x 或更高版本的 CLI 作为开发依赖。
  2. 创建 Prisma schema 并配置数据库连接 URL。
  3. 使用 Prisma ORM 2.x 或更高版本的 CLI 内省 Prisma 1 数据库并生成 Prisma schema。
  4. 运行 Prisma 1 Upgrade CLI 来“修复”Prisma schema。
  5. 安装并生成 Prisma Client 2.x 或更高版本。
  6. 调整应用程序代码,特别是用 Prisma Client 2.x 或更高版本的 API 调用替换 Prisma Client 1.0 的 API 调用。

下一步

决定升级后,请继续阅读升级 Prisma ORM 层指南。