升级到 Prisma ORM 3
如果你从早期版本(任何 2.x 版本)升级,Prisma ORM 3 引入了许多重大更改,因此,了解此次升级可能如何影响你的应用程序并进行任何必要的调整以确保平稳过渡非常重要。
以下是重大更改列表以及如何处理它们。
重大更改
引用操作
3.x 版本中引入的引用操作移除了 Prisma Client 中之前在运行时阻止级联删除的安全网。
因此,根据你用于应用程序的工作流程,你可能会受到影响。我们建议你检查你的 schema 并决定是否需要明确定义引用操作。
请参阅引用操作升级路径以了解如何操作。
命名约束
我们更改了 Prisma ORM 命名约束和索引所遵循的约定。我们还在 PSL 中引入了 map
属性(数据库级名称)和 name
属性(Prisma Client API 名称)之间的明确区分,以显式控制 Prisma schema 中约束的定义方式。
这意味着你在运行 Prisma migrate
或 db pull
时会注意到影响,它们将遵循此新约定。我们建议你调整你的 schema 以适当地反映你的约束和索引的名称。
你可以查看命名约束升级路径以获取更多信息,了解如何操作。
$queryRaw
从 3.x 版本开始,$queryRaw
方法现在只支持模板字面量。
这意味着如果你的应用程序依赖于使用字符串的 $queryRaw
调用,这些调用将不再起作用。我们建议你尽可能使用模板字面量以确保安全,否则在仔细转义查询以防止 SQL 注入后,求助于 $queryRawUnsafe
。
你可以在文档的原始数据库访问部分了解更多关于新的 $queryRaw
和 $queryRawUnsafe
方法。
Json 空值相等性
你不能通过空值过滤 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
字段,你将看到 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
。要在 Json
字段中插入 null
值,你可以这样写
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 和数据库 NULL 之间没有区别。
它们也不适用于 array_contains
操作符,因为 JSON 数组中只能有 JSON null。由于 JSON 数组中不能有数据库 NULL,所以 { array_contains: null }
不会产生歧义。
特定升级路径
命名约束升级路径
升级到 Prisma ORM 3 后,约束和索引名称的默认命名约定将发生变化,并且你的主键和外键名称现在将成为支持它们的数据库模式的一部分。因此,你现有 Prisma schema 的含义将发生变化。
引用操作升级路径
Prisma ORM 2.x 版本会阻止在某些 Prisma Client 函数中删除相关联的记录,并且不允许你在 Prisma Schema 中配置引用操作来更改此行为。
将 prisma
和 @prisma/client
包升级到 Prisma ORM 3
要从 2.x 版本升级到 3.x 版本,你需要更新 prisma
和 @prisma/client
包。prisma
和 @prisma/client
包在版本号中都带有插入符号 ^
,以防止重大更改。
要忽略插入符号 ^
并跨主要版本升级,你可以在使用 npm
或 yarn
升级时使用 @3
标签。
在升级之前,检查每项重大更改,查看升级可能如何影响你的应用程序。
- npm
- yarn
npm install prisma@3 @prisma/client@3
yarn up prisma@3 @prisma/client@3