跳到主要内容

升级到 Prisma ORM 3

如果您是从早期版本(任何 2.x 版本)升级,Prisma ORM 3 引入了许多重大更改,因此,了解此升级可能如何影响您的应用程序并进行任何必要的调整以确保平稳过渡非常重要。

下面您将找到重大更改列表以及如何处理它们。

重大更改

引用操作

在 3.x 版本中引入引用操作移除了 Prisma Client 中的安全网,该安全网以前阻止了运行时的级联删除。

因此,根据您用于处理应用程序的工作流程,您可能会受到影响。我们建议您检查您的 schema 并确定是否需要显式定义引用操作。

请参阅 引用操作升级路径 以了解如何进行。

命名约束

我们更改了 Prisma ORM 遵循的命名约束和索引的约定。我们还在 PSL 中引入了 map 属性(数据库级别名称)和 name 属性(Prisma Client API 名称)之间的明确区分,以显式控制约束在 Prisma schema 中的定义方式。

这意味着当运行 Prisma migratedb pull 时,您会注意到影响,它们将遵循这个新约定。我们建议您调整您的 schema 以适当反映您的约束和索引的名称。

您可以查看 命名约束升级路径 以获取有关如何进行的更多信息。

$queryRaw

从 3.x 版本开始,$queryRaw 方法现在仅支持模板字面量。

这意味着如果您的应用程序依赖于使用字符串的 $queryRaw 调用,这些调用将不再起作用。我们建议您尽可能使用模板字面量以出于安全原因,否则请使用 $queryRawUnsafe,并在仔细转义查询以防止 SQL 注入后使用。

您可以在文档的 原始数据库访问 部分了解有关新的 $queryRaw$queryRawUnsafe 方法的更多信息。

Json Null 相等性

您不能通过空值来过滤 Json 字段。 请参阅 此 GitHub issue。这是因为 { equals: null } 检查数据库中的列值是否为 NULL,而不是列内的 JSON 值是否等于 null

为了解决这个问题,我们决定将 Json 字段上的 null 分割为 JsonNull、DbNull 和 AnyNull。

  • JsonNull:选择 JSON 中的空值。
  • DbNull:选择数据库中的 NULL 值。
  • AnyNull:选择 JSON 空值和数据库 NULL 值。

假设您的 Prisma Schema 中有以下模型

model Log {
id Int @id
meta Json
}

从 3.0.1 开始,如果您尝试通过 Json 字段上的 null 进行过滤,您将看到一个 TypeError

prisma.log.findMany({
where: {
data: {
meta: {
equals: null
^ TypeError: Type 'null' is not assignable to type
}
},
},
});

要解决此问题,您需要导入并使用一种新的 null 类型

import { Prisma } from '@prisma/client'

prisma.log.findMany({
where: {
data: {
meta: {
equals: Prisma.AnyNull,
},
},
},
})

这也适用于 create、update 和 upsert。 要将 null 值插入 Json 字段,您需要编写

import { Prisma } from '@prisma/client'

prisma.log.create({
data: {
meta: Prisma.JsonNull,
},
})

要将数据库 NULL 插入 Json 字段,您需要编写

import { Prisma } from '@prisma/client'

prisma.log.create({
data: {
meta: Prisma.DbNull,
},
})
警告

此 API 更改不适用于 MongoDB 连接器,因为在 MongoDB 连接器中,JSON 空值和数据库 NULL 之间没有区别。

它们也不适用于 array_contains 运算符,因为 JSON 数组中只能存在 JSON 空值。由于 JSON 数组中不能存在数据库 NULL,因此 { array_contains: null } 并不模棱两可。

特定升级路径

将 prisma 和 @prisma/client 包升级到 Prisma ORM 3

要从 2.x 版本升级到 3.x 版本,您需要更新 prisma 和 @prisma/client 包。 prisma 和 @prisma/client 包都使用插入符号 ^ 安装在其版本号中,以防止重大更改。

要忽略插入符号 ^ 并跨主要版本升级,您可以在使用 npm 或 yarn 升级时使用 @3 标签。

危险

在升级之前,请检查每个重大更改,以了解升级可能如何影响您的应用程序。

npm install prisma@3 @prisma/client@3