不支持的数据库功能
并非所有 Prisma ORM 支持的数据库的数据库功能和特性都具有 Prisma 架构语言的等效项。请参阅 数据库功能矩阵,以获取支持功能的完整列表。
原生数据库函数
Prisma 架构语言支持几个您可以用来设置字段的默认值的 函数。以下示例使用 Prisma ORM 级别的 uuid()
函数来设置 id
字段的值
model Post {
id String @id @default(uuid())
}
但是,您也可以使用 **原生数据库函数** 使用关系数据库上的 dbgenerated(...)
来定义默认值(MongoDB 没有数据库级函数的概念)。以下示例使用 PostgreSQL 的 gen_random_uuid()
函数来填充 id
字段
model User {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
}
何时使用数据库级函数
使用数据库级函数有两个原因
-
没有等效的 Prisma ORM 函数(例如,PostgreSQL 中的
gen_random_bytes
)。 -
您无法或不想依赖于诸如
uuid()
和cuid()
之类的函数,这些函数仅在 Prisma ORM 级别实现,并且不会在数据库中体现。考虑以下示例,它将
id
字段设置为随机生成的UUID
model Post {
id String @id @default(uuid())
}仅当您使用 Prisma 客户端创建
Post
时才会生成 UUID。如果您以任何其他方式创建帖子,例如使用纯 SQL 编写的批量导入脚本,则必须自己生成 UUID。
为原生数据库函数启用 PostgreSQL 扩展
在 PostgreSQL 中,一些原生数据库函数是扩展的一部分。例如,在 PostgreSQL 版本 12.13 及更早版本中,gen_random_uuid()
函数是 pgcrypto
扩展的一部分。
要使用 PostgreSQL 扩展,您必须首先将其安装在数据库服务器的文件系统上。
在 Prisma ORM 版本 4.5.0 及更高版本中,您可以通过使用 postgresqlExtensions
预览功能 在您的 Prisma 架构中声明它来激活扩展
generator client {
provider = "prisma-client-js"
previewFeatures = ["postgresqlExtensions"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
extensions = [pgcrypto]
}
在早期版本的 Prisma ORM 中,您必须改为运行 SQL 命令来激活扩展
CREATE EXTENSION IF NOT EXISTS pgcrypto;
如果您的项目使用 Prisma Migrate,则必须 将扩展安装为迁移的一部分 。不要手动安装扩展,因为它也是影子数据库所必需的。
如果扩展不可用,Prisma Migrate 会返回以下错误
Migration `20210221102106_failed_migration` failed to apply cleanly to a temporary database.
Database error: Error querying the database: db error: ERROR: type "pgcrypto" does not exist
不支持的字段类型
某些关系数据库的数据库类型,例如 polygon
或 geometry
,没有 Prisma 架构语言的等效项。使用 Unsupported
字段类型在您的 Prisma 架构中表示该字段
model Star {
id Int @id @default(autoincrement())
position Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle"))
}
prisma migrate dev
和 prisma db push
命令都将在数据库中创建一个类型为 circle
的 position
字段。但是,该字段在生成的 Prisma 客户端中将不可用。
不支持的数据库功能
某些功能,如 SQL 视图或部分索引,无法在 Prisma 架构中表示。如果您的项目使用 Prisma Migrate,则必须 将不支持的功能作为迁移的一部分包含在内 。