跳到主要内容

不支持的数据库功能 (Prisma Schema)

Prisma ORM 支持的数据库并非所有数据库函数和功能都有对应的 Prisma Schema Language 等价物。请参阅数据库功能矩阵以获取受支持功能的完整列表。

原生数据库函数

Prisma Schema Language 支持多种函数,您可以使用它们来设置字段的默认值。以下示例使用 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)。

  • 您不能或不想依赖仅在 Prisma ORM 级别实现且未在数据库中体现的函数,例如 uuid()cuid()

    考虑以下示例,它将 id 字段设置为随机生成的 UUID

    model Post {
    id String @id @default(uuid())
    }

    只有当您使用 Prisma Client 创建 Post 时,才会生成 UUID。如果您通过其他方式创建帖子,例如使用纯 SQL 编写的批量导入脚本,则必须自行生成 UUID。

为原生数据库函数启用 PostgreSQL 扩展

在 PostgreSQL 中,一些原生数据库函数是扩展的一部分。例如,在 PostgreSQL 12.13 及更早版本中,gen_random_uuid() 函数是pgcrypto扩展的一部分。

要使用 PostgreSQL 扩展,您必须首先将其安装在数据库服务器的文件系统上。

在 Prisma ORM 4.5.0 及更高版本中,您可以通过在 Prisma Schema 中使用postgresqlExtensions 预览功能来声明从而激活该扩展。

schema.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

不支持的字段类型

关系型数据库的某些数据库类型,例如 polygongeometry,没有对应的 Prisma Schema Language 等价物。使用Unsupported字段类型在 Prisma Schema 中表示该字段

model Star {
id Int @id @default(autoincrement())
position Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle"))
}

prisma migrate devprisma db push 命令都将在数据库中创建一个类型为 circleposition 字段。但是,该字段将无法在生成的 Prisma Client 中使用。

不支持的数据库功能

某些功能,例如 SQL 视图或部分索引,无法在 Prisma Schema 中表示。如果您的项目使用Prisma Migrate,则必须将不支持的功能作为迁移的一部分包含

© . All rights reserved.