跳至主要内容

升级到 Prisma ORM 3

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

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

重大更改

参照操作

3.x 版本中引入的参照操作消除了 Prisma Client 中之前阻止在运行时级联删除的安全网。

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

请参阅参照操作升级路径,了解如何继续操作。

命名约束

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

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

您可以查看命名约束升级路径,以获取有关如何继续操作的更多信息。

$queryRaw

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

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

您可以在文档的原始数据库访问部分详细了解新的 $queryRaw$queryRawUnsafe 方法。

Json 空值相等性

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

为了解决此问题,我们决定将 Json 字段上的空值拆分为 JsonNullDbNullAnyNull

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

给定您在 Prisma 模式中的以下模型

model Log {
id Int @id
meta Json
}

从 3.0.1 开始,如果您尝试在 Json 字段上按空值进行过滤,您将看到 TypeError

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

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

import { Prisma } from '@prisma/client'

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

这也适用于 createupdateupsert。要将 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 包都使用脱字符号 ^ 安装在其版本号中,以防范重大更改。

要忽略脱字符号 ^ 并跨主要版本进行升级,您可以在使用 npmyarn 升级时使用 @3 标签。

危险

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

npm install prisma@3 @prisma/client@3