Prisma schema 参考
datasource
在 Prisma schema 中定义数据源。
字段
datasource 块接受以下字段
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
provider | 是 | 字符串 (postgresql, mysql, sqlite, sqlserver, mongodb, cockroachdb) | 描述要使用的数据源连接器。 |
url | 是 | 字符串 (URL) | 在 Prisma ORM v7 中已弃用。 改为在 Prisma Config 中配置连接 URL:请参阅datasource.url。现有 schema 仍可使用,但您应迁移到 Prisma Config。 |
shadowDatabaseUrl | 否 | 字符串 (URL) | 在 Prisma ORM v7 中已弃用。 改为在 Prisma Config 中配置影子数据库 URL:请参阅datasource.shadowDatabaseUrl。 |
directUrl | 否 | 字符串 (URL) | 在 Prisma ORM v7 中已弃用。 改为在 Prisma Config 中配置直接连接 URL:请参阅datasource.directUrl。 |
relationMode | 否 | 字符串 (foreignKeys, prisma) | 设置参照完整性是由数据库中的外键强制执行,还是在 Prisma Client 中模拟。 在 3.1.1 及更高版本中为预览版。在 4.5.0 及更高版本中,该字段名为 relationMode,之前名为 referentialIntegrity。 |
extensions | 否 | 字符串列表(PostgreSQL 扩展名称) | 允许您在 schema 中表示 PostgreSQL 扩展。在 Prisma ORM 4.5.0 及更高版本中,仅适用于 PostgreSQL 的预览版。 |
自 Prisma ORM v7 起,Prisma schema datasource 块中的 url、directUrl 和 shadowDatabaseUrl 字段已弃用。请改为在Prisma Config中配置这些字段。
以下 provider 可用
备注
- 一个 schema 中只能有一个
datasource块。 datasource db是约定俗成的,但您可以为您的数据源指定任何名称,例如datasource mysql或datasource data。
示例
指定 PostgreSQL 数据源
在此示例中,目标数据库可使用以下凭据
- 用户:
johndoe - 密码:
mypassword - 主机:
localhost - 端口:
5432 - 数据库名称:
mydb - Schema 名称:
public
datasource db {
provider = "postgresql"
url = "postgresql://johndoe:mypassword@localhost:5432/mydb?schema=public"
}
在此处了解有关 PostgreSQL 连接字符串的更多信息这里。
通过环境变量指定 PostgreSQL 数据源
在此示例中,目标数据库可使用以下凭据
- 用户:
johndoe - 密码:
mypassword - 主机:
localhost - 端口:
5432 - 数据库名称:
mydb - Schema 名称:
public
datasource db {
provider = "postgresql"
}
当运行需要数据库连接 URL 的 Prisma CLI 命令(例如 prisma generate)时,您需要确保已设置 DATABASE_URL 环境变量。
一种方法是创建一个包含以下内容的 .env 文件。请注意,该文件必须与您的 schema.prisma 文件位于同一目录中,Prisma CLI 才能自动拾取它。
DATABASE_URL=postgresql://johndoe:mypassword@localhost:5432/mydb?schema=public
指定 MySQL 数据源
在此示例中,目标数据库可使用以下凭据
- 用户:
johndoe - 密码:
mypassword - 主机:
localhost - 端口:
3306 - 数据库名称:
mydb
datasource db {
provider = "mysql"
url = "mysql://johndoe:mypassword@localhost:3306/mydb"
}
在此处了解有关 MySQL 连接字符串的更多信息这里。
指定 MongoDB 数据源
- 用户:
root - 密码:
password - 主机:
cluster1.test1.mongodb.net - 端口:不适用
- 数据库名称:
testing
datasource db {
provider = "mongodb"
url = "mongodb+srv://root:password@cluster1.test1.mongodb.net/testing?retryWrites=true&w=majority"
}
在此处了解有关 MongoDB 连接字符串的更多信息这里。
指定 SQLite 数据源
在此示例中,目标数据库位于名为 dev.db 的文件中
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
在此处了解有关 SQLite 连接字符串的更多信息这里。
指定 CockroachDB 数据源
在此示例中,目标数据库可使用以下凭据
- 用户:
johndoe - 密码:
mypassword - 主机:
localhost - 端口:
26257 - 数据库名称:
mydb - Schema 名称:
public
datasource db {
provider = "cockroachdb"
url = "postgresql://johndoe:mypassword@localhost:26257/mydb?schema=public"
}
连接字符串的格式与 PostgreSQL 相同。在此处了解有关 PostgreSQL 连接字符串的更多信息这里。
generator
在 Prisma schema 中定义生成器。
prisma-client-js provider 的字段
这是 Prisma ORM 6.x 及更早版本的默认生成器。了解有关生成器的更多信息。
generator 块接受以下字段
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
provider | 是 | prisma-client-js | 描述要使用的生成器。这可以指向实现生成器的文件,也可以直接指定内置生成器。 |
output | 否 | 字符串(文件路径) | 确定生成的客户端的位置,了解更多。默认:node_modules/.prisma/client |
previewFeatures | 否 | 枚举列表 | 使用智能感知查看当前可用的预览功能列表(Visual Studio Code 中按 Ctrl+Space)默认:无 |
engineType | 否 | 枚举 (library 或 binary) | 定义要下载和使用的查询引擎类型。默认:library |
binaryTargets | 否 | 枚举列表(见下文) | 指定 Prisma Client 运行的操作系统,以确保查询引擎的兼容性。默认:native |
moduleFormat | 否 | 枚举 (cjs 或 esm) | 定义生成的 Prisma Client 的模块格式。此字段仅适用于 prisma-client 生成器。 |
我们建议定义一个自定义输出路径,将该路径添加到 .gitignore,然后确保通过自定义构建脚本或后安装钩子运行 prisma generate。
prisma-client provider 的字段
这个 ESM 优先的客户端生成器在不同的 JavaScript 环境中提供了更大的控制和灵活性。它将纯 TypeScript 代码生成到自定义目录中,提供了对生成代码的完全可见性。了解有关新的prisma-client生成器的更多信息。
prisma-client 生成器将成为 Prisma ORM 7.0 中的默认生成器,我们建议尽快迁移到它。它已在v6.16.0中普遍可用。
generator 块接受以下字段
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
provider | 是 | prisma-client | 描述要使用的生成器。这可以指向实现生成器的文件,也可以直接指定内置生成器。 |
output | 是 | 字符串(文件路径) | 确定生成的客户端的位置,了解更多。 |
previewFeatures | 否 | 枚举列表 | 使用智能感知查看当前可用的预览功能列表(Visual Studio Code 中按 Ctrl+Space)默认:无 |
runtime | 否 | 枚举 (nodejs, deno, bun, workerd (别名 cloudflare), vercel-edge (别名 edge-light), react-native) | 目标运行时环境。默认:nodejs |
moduleFormat | 否 | 枚举 (esm 或 cjs) | 确定生成的代码是否支持 ESM(使用 import)或 CommonJS(使用 require(...))模块。我们始终建议使用 esm,除非您有充分的理由使用 cjs。默认:从环境中推断。 |
generatedFileExtension | 否 | 枚举 (ts 或 mts 或 cts) | 生成 TypeScript 文件的文件扩展名。默认:ts |
importFileExtension | 否 | 枚举 (ts,mts,cts,js,mjs,cjs, 空 (用于裸导入)) | 导入语句中使用的文件扩展名。默认:从环境中推断。 |
binaryTargets 选项
下表列出了所有支持的操作系统,以及要在binaryTargets中指定的平台名称。
除非另有说明,否则默认支持的 CPU 架构是 x86_64。
macOS
| 构建操作系统 | Prisma 引擎构建名称 |
|---|---|
| macOS Intel x86_64 | darwin |
| macOS ARM64 | darwin-arm64 |
Windows
| 构建操作系统 | Prisma 引擎构建名称 |
|---|---|
| Windows | windows |
Linux (x86_64 架构上的 Alpine)
| 构建操作系统 | Prisma 引擎构建名称 | OpenSSL |
|---|---|---|
| Alpine (3.17 及更高版本) | linux-musl-openssl-3.0.x* | 3.0.x |
| Alpine (3.16 及更早版本) | linux-musl | 1.1.x |
* 在 Prisma ORM 4.8.0 及更高版本中可用。
Linux (ARM64 架构上的 Alpine)
| 构建操作系统 | Prisma 引擎构建名称 | OpenSSL |
|---|---|---|
| Alpine (3.17 及更高版本) | linux-musl-arm64-openssl-3.0.x* | 3.0.x |
| Alpine (3.16 及更早版本) | linux-musl-arm64-openssl-1.1.x* | 1.1.x |
* 在 Prisma ORM 4.10.0 及更高版本中可用。
Linux (Debian), x86_64
| 构建操作系统 | Prisma 引擎构建名称 | OpenSSL |
|---|---|---|
| Debian 8 (Jessie) | debian-openssl-1.0.x | 1.0.x |
| Debian 9 (Stretch) | debian-openssl-1.1.x | 1.1.x |
| Debian 10 (Buster) | debian-openssl-1.1.x | 1.1.x |
| Debian 11 (Bullseye) | debian-openssl-1.1.x | 1.1.x |
| Debian 12 (Bookworm) | debian-openssl-3.0.x | 3.0.x |
Linux (Ubuntu), x86_64
| 构建操作系统 | Prisma 引擎构建名称 | OpenSSL |
|---|---|---|
| Ubuntu 14.04 (trusty) | debian-openssl-1.0.x | 1.0.x |
| Ubuntu 16.04 (xenial) | debian-openssl-1.0.x | 1.0.x |
| Ubuntu 18.04 (bionic) | debian-openssl-1.1.x | 1.1.x |
| Ubuntu 19.04 (disco) | debian-openssl-1.1.x | 1.1.x |
| Ubuntu 20.04 (focal) | debian-openssl-1.1.x | 1.1.x |
| Ubuntu 21.04 (hirsute) | debian-openssl-1.1.x | 1.1.x |
| Ubuntu 22.04 (jammy) | debian-openssl-3.0.x | 3.0.x |
| Ubuntu 23.04 (lunar) | debian-openssl-3.0.x | 3.0.x |
Linux (CentOS), x86_64
| 构建操作系统 | Prisma 引擎构建名称 | OpenSSL |
|---|---|---|
| CentOS 7 | rhel-openssl-1.0.x | 1.0.x |
| CentOS 8 | rhel-openssl-1.1.x | 1.1.x |
Linux (Fedora), x86_64
| 构建操作系统 | Prisma 引擎构建名称 | OpenSSL |
|---|---|---|
| Fedora 28 | rhel-openssl-1.1.x | 1.1.x |
| Fedora 29 | rhel-openssl-1.1.x | 1.1.x |
| Fedora 30 | rhel-openssl-1.1.x | 1.1.x |
| Fedora 36 | rhel-openssl-3.0.x | 3.0.x |
| Fedora 37 | rhel-openssl-3.0.x | 3.0.x |
| Fedora 38 | rhel-openssl-3.0.x | 3.0.x |
Linux (Linux Mint), x86_64
| 构建操作系统 | Prisma 引擎构建名称 | OpenSSL |
|---|---|---|
| Linux Mint 18 | debian-openssl-1.0.x | 1.0.x |
| Linux Mint 19 | debian-openssl-1.1.x | 1.1.x |
| Linux Mint 20 | debian-openssl-1.1.x | 1.1.x |
| Linux Mint 21 | debian-openssl-3.0.x | 3.0.x |
Linux (Arch Linux), x86_64
| 构建操作系统 | Prisma 引擎构建名称 | OpenSSL |
|---|---|---|
| Arch Linux 2019.09.01 | debian-openssl-1.1.x | 1.1.x |
| Arch Linux 2023.04.23 | debian-openssl-3.0.x | 3.0.x |
Linux ARM64(所有主要发行版,但 Alpine 除外)
| 构建操作系统 | Prisma 引擎构建名称 | OpenSSL |
|---|---|---|
| 基于 glibc 的 Linux ARM64 发行版 | linux-arm64-openssl-1.0.x | 1.0.x |
| 基于 glibc 的 Linux ARM64 发行版 | linux-arm64-openssl-1.1.x | 1.1.x |
| 基于 glibc 的 Linux ARM64 发行版 | linux-arm64-openssl-3.0.x | 3.0.x |
示例
使用默认的 output、previewFeatures、engineType 和 binaryTargets 指定 prisma-client-js 生成器
generator client {
provider = "prisma-client-js"
}
请注意,上面的 generator 定义与以下定义等效,因为它使用了 output、engineType 和 binaryTargets(以及隐式 previewFeatures)的默认值
generator client {
provider = "prisma-client-js"
output = "node_modules/.prisma/client"
engineType = "library"
binaryTargets = ["native"]
}
为 Prisma Client 指定自定义 output 位置
此示例展示了如何定义生成的资产的自定义 output 位置以覆盖默认位置。
generator client {
provider = "prisma-client-js"
output = "../src/generated/client"
}
指定自定义 binaryTargets 以确保与操作系统兼容
此示例展示了如何根据上表配置 Prisma Client 以在 Ubuntu 19.04 (disco) 上运行。
generator client {
provider = "prisma-client-js"
binaryTargets = ["debian-openssl-1.1.x"]
}
指定指向某些自定义生成器实现的 provider
此示例展示了如何使用位于名为 my-generator 的目录中的自定义生成器。
generator client {
provider = "./my-generator"
}
model
定义 Prisma 模型。
备注
命名约定
- 模型名称必须符合以下正则表达式:
[A-Za-z][A-Za-z0-9_]* - 模型名称必须以字母开头,通常以PascalCase拼写
- 模型名称应使用单数形式(例如,
User而不是user、users或Users) - Prisma ORM 有许多保留字,它们在 Prisma ORM 内部使用,因此不能用作模型名称。您可以在这里和这里找到保留字。
注意:您可以使用
@@map属性将模型(例如User)映射到与模型命名约定不匹配的不同名称的表(例如users)。
字段顺序
- 在 2.3.0 及更高版本中,内省会按照数据库中相应列的相同顺序列出模型字段。关系字段列在标量字段之后。
示例
具有两个标量字段的名为 User 的模型
- 关系型数据库
- MongoDB
model User {
email String @unique // `email` can not be optional because it's the only unique field on the model
name String?
}
model User {
id String @default(auto()) @map("_id") @db.ObjectId
email String @unique
name String?
}
model 字段
字段是模型的属性。
备注
命名约定
- 必须以字母开头
- 通常以 camelCase 拼写
- 必须符合以下正则表达式:
[A-Za-z][A-Za-z0-9_]*
注意:您可以使用
@map属性将字段名称映射到列,其名称与字段命名约定不匹配:例如myField @map("my_field")。
model 字段标量类型
数据源连接器决定每个 Prisma ORM 标量类型映射到哪个原生数据库类型。类似地,生成器决定这些类型中的每一个映射到目标编程语言中的哪个类型。
Prisma 模型还具有模型字段类型,用于定义模型之间的关系。
String
可变长度文本。
默认类型映射
| 连接器 | 默认映射 |
|---|---|
| PostgreSQL | text |
| SQL Server | nvarchar(1000) |
| MySQL | varchar(191) |
| MongoDB | String |
| SQLite | TEXT |
| CockroachDB | STRING |
PostgreSQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
text | @db.Text | |
char(x) | @db.Char(x) | |
varchar(x) | @db.VarChar(x) | |
bit(x) | @db.Bit(x) | |
varbit | @db.VarBit | |
uuid | @db.Uuid | |
xml | @db.Xml | |
inet | @db.Inet | |
citext | @db.Citext | 仅在启用 Citext 扩展时可用。 |
MySQL
| 原生数据库类型 | 原生数据库类型属性 |
|---|---|
VARCHAR(x) | @db.VarChar(x) |
TEXT | @db.Text |
CHAR(x) | @db.Char(x) |
TINYTEXT | @db.TinyText |
MEDIUMTEXT | @db.MediumText |
LONGTEXT | @db.LongText |
您可以使用 Prisma Migrate 将 @db.Bit(1) 映射到 String
model Model {
/* ... */
myField String @db.Bit(1)
}
MongoDB
String
| 原生数据库类型属性 | 备注 |
|---|---|
@db.String | |
@db.ObjectId | 如果底层 BSON 类型是 OBJECT_ID(ID 字段、关系标量),则为必需 |
Microsoft SQL Server
| 原生数据库类型 | 原生数据库类型属性 |
|---|---|
char(x) | @db.Char(x) |
nchar(x) | @db.NChar(x) |
varchar(x) | @db.VarChar(x) |
nvarchar(x) | @db.NVarChar(x) |
text | @db.Text |
ntext | @db.NText |
xml | @db.Xml |
uniqueidentifier | @db.UniqueIdentifier |
SQLite
TEXT
CockroachDB
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
STRING(x) | TEXT(x) | VARCHAR(x) | @db.String(x) | |
CHAR(x) | @db.Char(x) | |
"char" | @db.CatalogSingleChar | |
BIT(x) | @db.Bit(x) | |
VARBIT | @db.VarBit | |
UUID | @db.Uuid | |
INET | @db.Inet |
请注意,PostgreSQL 中支持的 xml 和 citext 类型目前在 CockroachDB 中不受支持。
客户端
| Prisma Client JS |
|---|
string |
Boolean
真或假值。
默认类型映射
| 连接器 | 默认映射 |
|---|---|
| PostgreSQL | boolean |
| SQL Server | bit |
| MySQL | TINYINT(1) |
| MongoDB | Bool |
| SQLite | INTEGER |
| CockroachDB | BOOL |
PostgreSQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
boolean | @db.Boolean |
MySQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
TINYINT(1) | @db.TinyInt(1) | 如果最大长度大于 1(例如 TINYINT(2))或默认值不是 1、0 或 NULL,则 TINYINT 映射到 Int |
BIT(1) | @db.Bit |
MongoDB
Bool
Microsoft SQL Server
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
bit | @db.Bit |
SQLite
INTEGER
CockroachDB
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
BOOL | @db.Bool |
客户端
| Prisma Client JS |
|---|
boolean |
Int
默认类型映射
| 连接器 | 默认映射 |
|---|---|
| PostgreSQL | integer |
| SQL Server | int |
| MySQL | INT |
| MongoDB | Int |
| SQLite | INTEGER |
| CockroachDB | INT |
PostgreSQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
integer | int, int4 | @db.Integer | |
smallint | int2 | @db.SmallInt | |
smallserial | serial2 | @db.SmallInt @default(autoincrement()) | |
serial | serial4 | @db.Int @default(autoincrement()) | |
oid | @db.Oid |
MySQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
INT | @db.Int | |
INT UNSIGNED | @db.UnsignedInt | |
SMALLINT | @db.SmallInt | |
SMALLINT UNSIGNED | @db.UnsignedSmallInt | |
MEDIUMINT | @db.MediumInt | |
MEDIUMINT UNSIGNED | @db.UnsignedMediumInt | |
TINYINT | @db.TinyInt | 如果最大长度大于 1(例如 TINYINT(2))或默认值不是 1、0 或 NULL,则 TINYINT 映射到 Int。TINYINT(1) 映射到 Boolean。 |
TINYINT UNSIGNED | @db.UnsignedTinyInt | TINYINT(1) UNSIGNED 映射到 Int,而不是 Boolean |
YEAR | @db.Year |
MongoDB
Int
| 原生数据库类型属性 | 备注 |
|---|---|
@db.Int | |
@db.Long |
Microsoft SQL Server
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
int | @db.Int | |
smallint | @db.SmallInt | |
tinyint | @db.TinyInt | |
bit | @db.Bit |
SQLite
INTEGER
CockroachDB
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
INTEGER | INT | INT8 | @db.Int8 | 请注意,这与 PostgreSQL 不同,PostgreSQL 中 integer 和 int 是 int4 的别名并映射到 @db.Integer |
INT4 | @db.Int4 | |
INT2 | SMALLINT | @db.Int2 | |
SMALLSERIAL | SERIAL2 | @db.Int2 @default(autoincrement()) | |
SERIAL | SERIAL4 | @db.Int4 @default(autoincrement()) | |
SERIAL8 | BIGSERIAL | @db.Int8 @default(autoincrement()) |
客户端
| Prisma Client JS |
|---|
number |
BigInt
BigInt 在版本 2.17.0 及更高版本中可用。
默认类型映射
| 连接器 | 默认映射 |
|---|---|
| PostgreSQL | bigint |
| SQL Server | int |
| MySQL | BIGINT |
| MongoDB | Long |
| SQLite | INTEGER |
| CockroachDB | INTEGER |
PostgreSQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
bigint | int8 | @db.BigInt | |
bigserial | serial8 | @db.BigInt @default(autoincrement()) |
MySQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
BIGINT | @db.BigInt | |
SERIAL | @db.UnsignedBigInt @default(autoincrement()) |
MongoDB
Long
Microsoft SQL Server
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
bigint | @db.BigInt |
SQLite
INTEGER
CockroachDB
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
BIGINT | INT | INT8 | @db.Int8 | 请注意,这与 PostgreSQL 不同,其中 int 是 int4 的别名 |
bigserial | serial8 | @db.Int8 @default(autoincrement()) |
客户端
| 客户端 | 类型 | 描述 |
|---|---|---|
| Prisma Client JS | BigInt | 请参阅使用 BigInt 的示例 |
Float
浮点数。
Float在 2.17.0 及更高版本中映射到Double- 请参阅发行说明和视频:Prisma ORM 2.17.0 中 Float 默认映射的更改,了解有关此更改的更多信息。
默认类型映射
| 连接器 | 默认映射 |
|---|---|
| PostgreSQL | double precision |
| SQL Server | float(53) |
| MySQL | DOUBLE |
| MongoDB | Double |
| SQLite | REAL |
| CockroachDB | DOUBLE PRECISION |
PostgreSQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
double precision | @db.DoublePrecision | |
real | @db.Real |
MySQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
FLOAT | @db.Float | |
DOUBLE | @db.Double |
MongoDB
Double
Microsoft SQL Server
| 原生数据库类型 | 原生数据库类型属性 |
|---|---|
float | @db.Float |
money | @db.Money |
smallmoney | @db.SmallMoney |
real | @db.Real |
SQLite 连接器
REAL
CockroachDB
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
DOUBLE PRECISION | FLOAT8 | @db.Float8 | |
REAL | FLOAT4 | FLOAT | @db.Float4 |
客户端
| Prisma Client JS |
|---|
number |
Decimal
默认类型映射
| 连接器 | 默认映射 |
|---|---|
| PostgreSQL | decimal(65,30) |
| SQL Server | decimal(32,16) |
| MySQL | DECIMAL(65,30) |
| MongoDB | 不支持 |
| SQLite | DECIMAL |
| CockroachDB | DECIMAL |
PostgreSQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
decimal | numeric | @db.Decimal(p, s)† | |
money | @db.Money |
- †
p(精度),要存储的最大十进制数字总数。s(标度),小数点右侧存储的十进制数字的数量。
MySQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
DECIMAL | NUMERIC | @db.Decimal(p, s)† |
- †
p(精度),要存储的最大十进制数字总数。s(标度),小数点右侧存储的十进制数字的数量。
MongoDB
不支持.
Microsoft SQL Server
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
decimal | numeric | @db.Decimal(p, s)† |
- †
p(精度),要存储的最大十进制数字总数。s(标度),小数点右侧存储的十进制数字的数量。
SQLite
DECIMAL(在 2.17.0 中从 REAL 更改)
CockroachDB
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
DECIMAL | DEC | NUMERIC | @db.Decimal(p, s)† | |
money | 暂不支持 | CockroachDB 尚不支持 PostgreSQL 的 money 类型 |
- †
p(精度),要存储的最大十进制数字总数。s(标度),小数点右侧存储的十进制数字的数量。
客户端
| 客户端 | 类型 | 描述 |
|---|---|---|
| Prisma Client JS | Decimal | 请参阅使用 Decimal 的示例 |
DateTime
备注
- Prisma Client 将所有
DateTime作为原生Date对象返回。 - 目前,Prisma ORM 不支持 MySQL 中的零日期(
0000-00-00 00:00:00、0000-00-00、00:00:00)。 - 目前存在一个bug,它不允许您将
DateTime值作为字符串传递,并在您这样做时产生运行时错误。DateTime值需要作为Date对象传递(即new Date('2024-12-04')而不是'2024-12-04')。
您可以在此部分找到更多信息和示例:使用 DateTime。
默认类型映射
| 连接器 | 默认映射 |
|---|---|
| PostgreSQL | timestamp(3) |
| SQL Server | datetime2 |
| MySQL | DATETIME(3) |
| MongoDB | Timestamp |
| SQLite | NUMERIC |
| CockroachDB | TIMESTAMP |
PostgreSQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
timestamp(x) | @db.Timestamp(x) | |
timestamptz(x) | @db.Timestamptz(x) | |
date | @db.Date | |
time(x) | @db.Time(x) | |
timetz(x) | @db.Timetz(x) |
MySQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
DATETIME(x) | @db.DateTime(x) | |
DATE(x) | @db.Date(x) | |
TIME(x) | @db.Time(x) | |
TIMESTAMP(x) | @db.Timestamp(x) |
您也可以使用 MySQL 的 YEAR 类型和 Int
yearField Int @db.Year
MongoDB
Timestamp
Microsoft SQL Server
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
date | @db.Date | |
time | @db.Time | |
datetime | @db.DateTime | |
datetime2 | @db.DateTime2 | |
smalldatetime | @db.SmallDateTime | |
datetimeoffset | @db.DateTimeOffset |
SQLite
NUMERIC 或 STRING。如果底层数据类型是 STRING,您必须使用以下格式之一
CockroachDB
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
TIMESTAMP(x) | @db.Timestamp(x) | |
TIMESTAMPTZ(x) | @db.Timestamptz(x) | |
DATE | @db.Date | |
TIME(x) | @db.Time(x) | |
TIMETZ(x) | @db.Timetz(x) |
客户端
| Prisma Client JS |
|---|
Date |
Json
一个 JSON 对象。
默认类型映射
| 连接器 | 默认映射 |
|---|---|
| PostgreSQL | jsonb |
| SQL Server | 不支持 |
| MySQL | JSON |
| MongoDB | 一个有效的 BSON 对象(宽松模式) |
| SQLite | JSONB |
| CockroachDB | JSONB |
PostgreSQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
json | @db.Json | |
jsonb | @db.JsonB |
MySQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
JSON | @db.Json |
MongoDB
Microsoft SQL Server
Microsoft SQL Server 没有专门的 JSON 数据类型。但是,有许多内置函数用于读取和修改 JSON。
SQLite
不支持
CockroachDB
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
JSON | JSONB | @db.JsonB |
客户端
| Prisma Client JS |
|---|
object |
Bytes
Bytes 在版本 2.17.0 及更高版本中可用。
默认类型映射
| 连接器 | 默认映射 |
|---|---|
| PostgreSQL | bytea |
| SQL Server | varbinary |
| MySQL | LONGBLOB |
| MongoDB | BinData |
| SQLite | BLOB |
| CockroachDB | BYTES |
PostgreSQL
| 原生数据库类型 | 原生数据库类型属性 |
|---|---|
bytea | @db.ByteA |
MySQL
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
LONGBLOB | @db.LongBlob | |
BINARY | @db.Binary | |
VARBINARY | @db.VarBinary | |
TINYBLOB | @db.TinyBlob | |
BLOB | @db.Blob | |
MEDIUMBLOB | @db.MediumBlob | |
BIT | @db.Bit |
MongoDB
BinData
| 原生数据库类型属性 | 备注 |
|---|---|
@db.ObjectId | 如果底层 BSON 类型是 OBJECT_ID(ID 字段、关系标量),则为必需 |
@db.BinData |
Microsoft SQL Server
| 原生数据库类型 | 原生数据库类型属性 | 备注 |
|---|---|---|
binary | @db.Binary | |
varbinary | @db.VarBinary | |
image | @db.Image |
SQLite
BLOB
CockroachDB
| 原生数据库类型 | 原生数据库类型属性 |
|---|---|
BYTES | BYTEA | BLOB | @db.Bytes |
客户端
| 客户端 | 类型 | 描述 |
|---|---|---|
| Prisma Client JS | Uint8Array | 请参阅使用 Bytes 的示例 |
| Prisma Client JS(v6 之前) | Buffer | 请参阅使用 Bytes 的示例 |
Unsupported
MongoDB 不支持
MongoDB 连接器不支持 Unsupported 类型。
Unsupported 类型是在 2.17.0 中引入的,允许您在 Prisma schema 中表示 Prisma Client 不支持的数据类型。类型为 Unsupported 的字段可以使用 prisma db pull 在内省期间创建,也可以手动编写,并使用 Prisma Migrate 或 db push 在数据库中创建。
备注
-
生成的客户端中不提供具有
Unsupported类型的字段。 -
如果模型包含必需的
Unsupported类型,则 Prisma Client 中不提供prisma.model.create(..)、prisma.model.update(...)和prisma.model.upsert(...)。 -
当您内省包含不支持类型的数据库时,Prisma ORM 将提供以下警告
*** WARNING ***
These fields are not supported by Prisma Client, because Prisma does not currently support their types.
* Model "Post", field: "circle", original data type: "circle"
示例
model Star {
id Int @id @default(autoincrement())
position Unsupported("circle")?
example1 Unsupported("circle")
circle Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle"))
}
model 字段类型修饰符
[] 修饰符
使字段成为列表。
备注
- 不能是可选的(例如
Post[]?)。
关系型数据库
- 只有当您的数据库原生支持标量列表时,数据模型才支持标量列表(数组)。因此,目前仅在使用 PostgreSQL 或 CockroachDB 时支持标量列表(因为 MySQL 和 SQLite 不原生支持标量列表)。
MongoDB
- 支持标量列表
示例
定义标量列表
- 关系型数据库
- MongoDB
model User {
id Int @id @default(autoincrement())
favoriteColors String[]
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
favoriteColors String[]
}
定义具有默认值的标量列表
在版本 4.0.0 及更高版本中可用。
- 关系型数据库
- MongoDB
model User {
id Int @id @default(autoincrement())
favoriteColors String[] @default(["red", "blue", "green"])
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
favoriteColors String[] @default(["red", "blue", "green"])
}
? 修饰符
使字段可选。
备注
- 不能与列表字段一起使用(例如
Posts[])
示例
可选的 name 字段
model User {
id Int @id @default(autoincrement())
name String?
}
属性
属性修改字段或块(例如模型)的行为。有两种方法可以将属性添加到数据模型中
- 字段属性以
@为前缀 - 块属性以
@@为前缀
某些属性接受参数。属性中的参数始终命名,但在大多数情况下,可以省略参数名称。
注意:签名中的前导下划线表示可以省略参数名称。
@id
在模型上定义单字段 ID。
备注
通用
- 不能在关系字段上定义
- 不能是可选的
关系数据库
-
对应的数据库结构:
PRIMARY KEY -
可以在任何标量字段上定义(
String、Int、enum)
MongoDB
-
对应的数据库结构:除数组外的任何有效 BSON 类型
-
每个模型都必须定义一个
@id字段 -
底层 ID 字段名称始终为
_id,并且必须使用@map("_id")进行映射 -
可以在任何标量字段上定义(
String、Int、enum),除非您想在数据库中使用ObjectId -
要将
ObjectId用作您的 ID,您必须 -
支持
cuid()、uuid()和ulid(),但它们不会生成有效的ObjectId- 对于@id请改用auto() -
不支持
autoincrement()
参数
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
map | 否 | String | 数据库中底层主键约束的名称。 MySQL 或 MongoDB 不支持。 |
length | 否 | number | 允许您指定要索引的值子部分的最大长度。 仅限 MySQL。在 3.5.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
sort | 否 | String | 允许您指定 ID 条目在数据库中的存储顺序。可用选项为 Asc 和 Desc。仅限 SQL Server。在 3.5.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
clustered | 否 | Boolean | 定义 ID 是聚簇的还是非聚簇的。默认为 true。仅限 SQL Server。在 3.13.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
签名
@id(map: String?, length: number?, sort: String?, clustered: Boolean?)
注意:在 4.0.0 版本之前,或在 3.5.0 版本启用
extendedIndexes预览功能时,签名是@id(map: String?)
注意:在 3.0.0 版本之前,签名是
@id
示例
在大多数情况下,您希望数据库创建 ID。为此,请使用 @default 属性注释 ID 字段,并使用函数初始化该字段。
生成自增整数作为 ID(仅限关系数据库)
model User {
id Int @id @default(autoincrement())
name String
}
生成 ObjectId 作为 ID(仅限 MongoDB)
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
name String
}
生成 cuid() 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(cuid())
name String
}
model User {
id String @id @default(cuid()) @map("_id")
name String
}
如果您的 id 字段是 ObjectId 类型,则不能使用 cuid() 生成默认值。请使用以下语法生成有效的 ObjectId
id String @id @default(auto()) @db.ObjectId @map("_id")
生成 uuid() 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(uuid())
name String
}
model User {
id String @id @default(uuid()) @map("_id")
name String
}
如果您的 id 字段是 ObjectId 类型,则不能使用 uuid() 生成默认值。请使用以下语法生成有效的 ObjectId
id String @id @default(auto()) @db.ObjectId @map("_id")
生成 ulid() 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(ulid())
name String
}
model User {
id String @id @default(ulid()) @map("_id")
name String
}
如果您的 id 字段是 ObjectId 类型,则不能使用 ulid() 生成默认值。请使用以下语法生成有效的 ObjectId
id String @id @default(auto()) @db.ObjectId @map("_id")
不带默认值的单字段 ID
在以下示例中,id 没有默认值
- 关系型数据库
- MongoDB
model User {
id String @id
name String
}
model User {
id String @id @map("_id") @db.ObjectId
name String
}
model User {
id String @id @map("_id")
name String
}
请注意,在上述情况下,当使用 Prisma Client 为 User 模型创建新记录时,您必须提供自己的 ID 值,例如
const newUser = await prisma.user.create({
data: {
id: 1,
name: "Alice",
},
});
指定关系标量字段的 ID,不带默认值
在以下示例中,authorId 既是关系标量又是 Profile 的 ID
- 关系型数据库
- MongoDB
model Profile {
authorId Int @id
author User @relation(fields: [authorId], references: [id])
bio String
}
model User {
id Int @id
email String @unique
name String?
profile Profile?
}
model Profile {
authorId String @id @map("_id") @db.ObjectId
author User @relation(fields: [authorId], references: [id])
bio String
}
model User {
id String @id @map("_id") @db.ObjectId
email String @unique
name String?
profile Profile?
}
在这种情况下,您不能只创建 Profile - 您必须使用 Prisma Client 的嵌套写入来创建 User 或将配置文件连接到现有用户。
以下示例创建了一个用户和一个配置文件
const userWithProfile = await prisma.user.create({
data: {
id: 3,
email: "bob@prisma.io",
name: "Bob Prismo",
profile: {
create: {
bio: "Hello, I'm Bob Prismo and I love apples, blue nail varnish, and the sound of buzzing mosquitoes.",
},
},
},
});
以下示例将新的配置文件连接到用户
const profileWithUser = await prisma.profile.create({
data: {
bio: "Hello, I'm Bob and I like nothing at all. Just nothing.",
author: {
connect: {
id: 22,
},
},
},
});
@@id
MongoDB 不支持
MongoDB 连接器不支持复合 ID。
在模型上定义多字段 ID(复合 ID)。
备注
- 对应的数据库类型:
PRIMARY KEY - 可以使用函数自动生成 ID 的
@default属性进行注释 - 不能是可选的
- 可以在任何标量字段上定义(
String、Int、enum) - 不能在关系字段上定义
- Prisma Client 中复合 ID 字段的名称具有以下模式:
field1_field2_field3
参数
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
fields | 是 | FieldReference[] | 字段名称列表 - 例如 ["firstname", "lastname"] |
名称 | 否 | String | Prisma Client 将为涵盖所有字段的参数公开的名称,例如 fullName 在 fullName: { firstName: "First", lastName: "Last"} 中 |
map | 否 | String | 数据库中底层主键约束的名称。 MySQL 不支持。 |
length | 否 | number | 允许您指定要索引的值子部分的最大长度。 仅限 MySQL。在 3.5.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
sort | 否 | String | 允许您指定 ID 条目在数据库中的存储顺序。可用选项为 Asc 和 Desc。仅限 SQL Server。在 3.5.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
clustered | 否 | Boolean | 定义 ID 是聚簇的还是非聚簇的。默认为 true。仅限 SQL Server。在 3.13.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
可以省略 @@id 属性上 fields 参数的名称
@@id(fields: [title, author])
@@id([title, author])
签名
@@id(_ fields: FieldReference[], name: String?, map: String?)
注意:在 3.0.0 版本之前,签名是
@@id(_ fields: FieldReference[])
示例
在两个 String 字段上指定多字段 ID(仅限关系数据库)
model User {
firstName String
lastName String
email String @unique
isAdmin Boolean @default(false)
@@id([firstName, lastName])
}
创建用户时,您必须提供 firstName 和 lastName 的唯一组合
const user = await prisma.user.create({
data: {
firstName: "Alice",
lastName: "Smith",
},
});
要检索用户,请使用生成的复合 ID 字段(firstName_lastName)
const user = await prisma.user.findUnique({
where: {
firstName_lastName: {
firstName: "Alice",
lastName: "Smith",
},
},
});
在两个 String 字段和一个 Boolean 字段上指定多字段 ID(仅限关系数据库)
model User {
firstName String
lastName String
email String @unique
isAdmin Boolean @default(false)
@@id([firstName, lastName, isAdmin])
}
创建新的 User 记录时,您现在必须为 firstName、lastName 和 isAdmin 提供唯一的值组合
const user = await prisma.user.create({
data: {
firstName: "Alice",
lastName: "Smith",
isAdmin: true,
},
});
指定包含关系字段的多字段 ID(仅限关系数据库)
model Post {
title String
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
@@id([authorId, title])
}
model User {
id Int @default(autoincrement())
email String @unique
name String?
posts Post[]
}
创建新的 Post 记录时,您现在必须为 authorId(外键)和 title 提供唯一的值组合
const post = await prisma.post.create({
data: {
title: "Hello World",
author: {
connect: {
email: "alice@prisma.io",
},
},
},
});
@default
为字段定义默认值。
备注
- 使用内省时,尚未能在 Prisma schema 中表示的默认值由
dbgenerated()函数表示。 - Prisma schema 中的关系字段不允许使用默认值。但请注意,您仍然可以在支持关系的字段(
@relation属性中fields参数中列出的字段)上定义默认值。关系支持字段上的默认值意味着该关系将自动为您填充。 - 默认值可用于原生支持它们的数据库中的标量列表。
关系数据库
- 对应的数据库结构:
DEFAULT - 默认值可以是静态值(
4、"hello")或以下函数之一autoincrement()sequence()(仅限 CockroachDB)dbgenerated(...)cuid()cuid(2)uuid()uuid(4)uuid(7)ulid()nanoid()now()
- 使用内省时,尚未能在 Prisma schema 中表示的默认值由
dbgenerated(...)函数表示。 - Prisma schema 中的关系字段不允许使用默认值。但请注意,您仍然可以在支持关系的字段(
@relation属性中fields参数中列出的字段)上定义默认值。关系支持字段上的默认值意味着该关系将自动为您填充。 - 默认值可用于原生支持它们的数据库中的标量列表。
- JSON 数据。请注意,JSON 需要在
@default属性中用双引号括起来,例如:@default("[]")。如果您想提供一个 JSON 对象,您需要用双引号括起来,然后使用反斜杠转义任何内部双引号,例如:@default("{ \"hello\": \"world\" }")。
MongoDB
- 默认值可以是静态值(
4、"hello")或以下函数之一
参数
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
value | 是 | 表达式(例如 5、true、now()) | |
map | 否 | String | 仅限 SQL Server。 |
可以省略 @default 属性上 value 参数的名称
id Int @id @default(value: autoincrement())
id Int @id @default(autoincrement())
签名
@default(_ value: Expression, map: String?)
注意:在 3.0.0 版本之前,签名是
@default(_ value: Expression)
示例
Int 的默认值
- 关系型数据库
- MongoDB
model User {
email String @unique
profileViews Int @default(0)
}
model User {
id String @default(auto()) @map("_id") @db.ObjectId
profileViews Int @default(0)
}
Float 的默认值
- 关系型数据库
- MongoDB
model User {
email String @unique
number Float @default(1.1)
}
model User {
id String @default(auto()) @map("_id") @db.ObjectId
number Float @default(1.1)
}
Decimal 的默认值
- 关系型数据库
- MongoDB
model User {
email String @unique
number Decimal @default(22.99)
}
不支持.
BigInt 的默认值
- 关系型数据库
- MongoDB
model User {
email String @unique
number BigInt @default(34534535435353)
}
model User {
id String @default(auto()) @map("_id") @db.ObjectId
number BigInt @default(34534535435353)
}
String 的默认值
- 关系型数据库
- MongoDB
model User {
email String @unique
name String @default("")
}
model User {
id String @default(auto()) @map("_id") @db.ObjectId
name String @default("")
}
Boolean 的默认值
- 关系型数据库
- MongoDB
model User {
email String @unique
isAdmin Boolean @default(false)
}
model User {
id String @default(auto()) @map("_id") @db.ObjectId
isAdmin Boolean @default(false)
}
DateTime 的默认值
请注意,DateTime 的静态默认值基于 ISO 8601 标准。
- 关系型数据库
- MongoDB
model User {
email String @unique
data DateTime @default("2020-03-19T14:21:00+02:00")
}
model User {
id String @default(auto()) @map("_id") @db.ObjectId
data DateTime @default("2020-03-19T14:21:00+02:00")
}
Bytes 的默认值
- 关系型数据库
- MongoDB
model User {
email String @unique
secret Bytes @default("SGVsbG8gd29ybGQ=")
}
model User {
id String @default(auto()) @map("_id") @db.ObjectId
secret Bytes @default("SGVsbG8gd29ybGQ=")
}
enum 的默认值
- 关系型数据库
- MongoDB
enum Role {
USER
ADMIN
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
role Role @default(USER)
posts Post[]
profile Profile?
}
enum Role {
USER
ADMIN
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
name String?
role Role @default(USER)
posts Post[]
profile Profile?
}
标量列表的默认值
- 关系型数据库
- MongoDB
model User {
id Int @id @default(autoincrement())
posts Post[]
favoriteColors String[] @default(["red", "yellow", "purple"])
roles Role[] @default([USER, DEVELOPER])
}
enum Role {
USER
DEVELOPER
ADMIN
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
posts Post[]
favoriteColors String[] @default(["red", "yellow", "purple"])
roles Role[] @default([USER, DEVELOPER])
}
enum Role {
USER
DEVELOPER
ADMIN
}
@unique
为此字段定义唯一约束。
备注
通用
- 用
@unique注释的字段可以是可选的或必需的 - 如果用
@unique注释的字段表示模型上唯一没有@id/@@id的唯一约束,则它必须是必需的 - 一个模型可以有任意数量的唯一约束
- 可以在任何标量字段上定义
- 不能在关系字段上定义
关系数据库
- 对应的数据库构造:
UNIQUE NULL值被认为是不同的(允许在同一列中包含NULL值的多行)- 添加唯一约束会自动为指定的列添加相应的唯一索引。
MongoDB
- 由 MongoDB 中的唯一索引 强制执行
参数
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
map | 否 | String | |
length | 否 | number | 允许您指定要索引的值子部分的最大长度。 仅限 MySQL。在 3.5.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
sort | 否 | String | 允许您指定约束条目在数据库中的存储顺序。可用选项为 Asc 和 Desc。在 3.5.0 及更高版本中处于预览状态,在 4.0.0 及更高版本中普遍可用。 |
clustered | 否 | Boolean | 定义约束是聚集的还是非聚集的。默认为 false。仅限 SQL Server。在 3.13.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
- ¹ 某些索引和字段类型可能需要。
签名
@unique(map: String?, length: number?, sort: String?)
注意:在 4.0.0 版本之前,或在 3.5.0 版本启用
extendedIndexes预览功能时,签名是@unique(map: String?)
注意:在 3.0.0 版本之前,签名是
@unique
示例
在必填 String 字段上指定唯一属性
- 关系型数据库
- MongoDB
model User {
email String @unique
name String
}
model User {
id String @default(auto()) @map("_id") @db.ObjectId
name String
}
在可选 String 字段上指定唯一属性
- 关系型数据库
- MongoDB
model User {
id Int @id @default(autoincrement())
email String? @unique
name String
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String? @unique
name String
}
在关系标量字段 authorId 上指定唯一属性
- 关系型数据库
- MongoDB
model Post {
author User @relation(fields: [authorId], references: [id])
authorId Int @unique
title String
published Boolean @default(false)
}
model User {
id Int @id @default(autoincrement())
email String? @unique
name String
Post Post[]
}
model Post {
author User @relation(fields: [authorId], references: [id])
authorId String @unique @db.ObjectId
title String
published Boolean @default(false)
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String? @unique
name String
Post Post[]
}
使用 cuid() 值作为默认值指定唯一属性
- 关系型数据库
- MongoDB
model User {
token String @unique @default(cuid())
name String
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
token String @unique @default(cuid())
name String
}
@@unique
为指定字段定义复合 唯一约束。
备注
通用
-
构成唯一约束的所有字段必须是强制字段。以下模型无效,因为
id可能为nullmodel User {
firstname Int
lastname Int
id Int?
@@unique([firstname, lastname, id])
}出现此行为的原因是所有连接器都将
null值视为不同,这意味着两个看起来相同的行被认为是唯一的firstname | lastname | id
-----------+----------+------
John | Smith | null
John | Smith | null -
一个模型可以有任意数量的
@@unique块
关系数据库
- 对应的数据库构造:
UNIQUE - 如果
@@unique块表示模型上唯一没有@id/@@id的唯一约束,则它是必需的 - 添加唯一约束会自动为指定的列添加相应的唯一索引
MongoDB
- 由 MongoDB 中的复合索引 强制执行
@@unique块不能用作模型的唯一标识符 - MongoDB 需要@id字段
参数
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
fields | 是 | FieldReference[] | 字段名称列表 - 例如,["firstname", "lastname"]。字段必须是强制性的 - 请参阅备注。 |
名称 | 否 | String | 字段唯一组合的名称 - 默认为 fieldName1_fieldName2_fieldName3 |
map | 否 | String | |
length | 否 | number | 允许您指定要索引的值子部分的最大长度。 仅限 MySQL。在 3.5.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
sort | 否 | String | 允许您指定约束条目在数据库中的存储顺序。可用选项为 Asc 和 Desc。在 3.5.0 及更高版本中处于预览状态,在 4.0.0 及更高版本中普遍可用。 |
clustered | 否 | Boolean | 定义约束是聚集的还是非聚集的。默认为 false。仅限 SQL Server。在 3.13.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
可以省略 @@unique 属性上 fields 参数的名称
@@unique(fields: [title, author])
@@unique([title, author])
@@unique(fields: [title, author], name: "titleAuthor")
length 和 sort 参数被添加到相关字段名称中
@@unique(fields: [title(length:10), author])
@@unique([title(sort: Desc), author(sort: Asc)])
签名
@@unique(_ fields: FieldReference[], name: String?, map: String?)
注意:在 4.0.0 版本之前,或在 3.5.0 版本之前启用
extendedIndexes预览功能时,签名是@@unique(_ fields: FieldReference[], name: String?, map: String?)
注意:在 3.0.0 版本之前,签名是
@@unique(_ fields: FieldReference[], name: String?)
示例
在两个 String 字段上指定多字段唯一属性
- 关系型数据库
- MongoDB
model User {
id Int @default(autoincrement())
firstName String
lastName String
isAdmin Boolean @default(false)
@@unique([firstName, lastName])
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
firstName String
lastName String
isAdmin Boolean @default(false)
@@unique([firstName, lastName])
}
要检索用户,请使用生成的字段名称 (firstname_lastname)
const user = await prisma.user.findUnique({
where: {
firstName_lastName: {
firstName: "Alice",
lastName: "Smith",
isAdmin: true,
},
},
});
在两个 String 字段和一个 Boolean 字段上指定多字段唯一属性
- 关系型数据库
- MongoDB
model User {
id Int @default(autoincrement())
firstName String
lastName String
isAdmin Boolean @default(false)
@@unique([firstName, lastName, isAdmin])
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
firstName String
lastName String
isAdmin Boolean @default(false)
@@unique([firstName, lastName, isAdmin])
}
指定包含关系字段的多字段唯一属性
- 关系型数据库
- MongoDB
model Post {
id Int @default(autoincrement())
author User @relation(fields: [authorId], references: [id])
authorId Int
title String
published Boolean @default(false)
@@unique([authorId, title])
}
model User {
id Int @id @default(autoincrement())
email String @unique
posts Post[]
}
model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
author User @relation(fields: [authorId], references: [id])
authorId String @db.ObjectId
title String
published Boolean @default(false)
@@unique([authorId, title])
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
posts Post[]
}
为多字段唯一属性指定自定义 name
- 关系型数据库
- MongoDB
model User {
id Int @default(autoincrement())
firstName String
lastName String
isAdmin Boolean @default(false)
@@unique(fields: [firstName, lastName, isAdmin], name: "admin_identifier")
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
firstName String
lastName String
isAdmin Boolean @default(false)
@@unique(fields: [firstName, lastName, isAdmin], name: "admin_identifier")
}
要检索用户,请使用自定义字段名称 (admin_identifier)
const user = await prisma.user.findUnique({
where: {
admin_identifier: {
firstName: "Alice",
lastName: "Smith",
isAdmin: true,
},
},
});
@@index
在数据库中定义索引。
备注
关系数据库
- 对应的数据库构造:
INDEX - 还有一些额外的索引配置选项尚不能通过 Prisma schema 提供。这些选项包括
- PostgreSQL 和 CockroachDB
- 将索引字段定义为表达式(例如
CREATE INDEX title ON public."Post"((lower(title)) text_ops);) - 使用
WHERE定义部分索引 - 使用
CONCURRENTLY并发创建索引
- 将索引字段定义为表达式(例如
- PostgreSQL 和 CockroachDB
虽然您无法在 Prisma schema 中配置这些选项,但您仍然可以直接在数据库级别配置它们。
MongoDB
参数
| 名称 | 必需 | 类型 | 描述 |
|---|---|---|---|
fields | 是 | FieldReference[] | 字段名称列表 - 例如 ["firstname", "lastname"] |
名称 | 否 | String | Prisma Client 将为涵盖所有字段的参数公开的名称,例如 fullName 在 fullName: { firstName: "First", lastName: "Last"} 中 |
map | 否 | map | 底层数据库中索引的名称(如果未指定名称,Prisma 将生成一个遵守标识符长度限制的索引名称。Prisma 使用以下命名约定:tablename.field1_field2_field3_unique) |
length | 否 | number | 允许您指定要索引的值子部分的最大长度。 仅限 MySQL。在 3.5.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
sort | 否 | String | 允许您指定索引或约束的条目在数据库中的存储顺序。可用选项为 asc 和 desc。在 3.5.0 及更高版本中处于预览状态,在 4.0.0 及更高版本中普遍可用。 |
clustered | 否 | Boolean | 定义索引是聚集的还是非聚集的。默认为 false。仅限 SQL Server。在 3.5.0 及更高版本中为预览版,在 4.0.0 及更高版本中为正式发布版。 |
类型 | 否 | 标识符 | 允许您指定索引访问方法。默认为 BTree。仅限 PostgreSQL 和 CockroachDB。在 3.6.0 及更高版本中, Hash 索引访问方法处于预览状态,在 3.14.0 中添加了 Gist、Gin、SpGist 和 Brin 方法。在 4.0.0 及更高版本中普遍可用。 |
操作 | 否 | identifier 或 function | 允许您定义某些索引类型的索引操作符。 仅限 PostgreSQL。在 3.14.0 及更高版本中处于预览状态,在 4.0.0 及更高版本中普遍可用。 |
可以省略 @@index 属性上 fields 参数的名称
@@index(fields: [title, author])
@@index([title, author])
length 和 sort 参数被添加到相关字段名称中
@@index(fields: [title(length:10), author])
@@index([title(sort: Asc), author(sort: Desc)])
签名
@@index(_ fields: FieldReference[], map: String?)
注意:在 3.0.0 版本之前,签名是
@@index(_ fields: FieldReference[], name: String?)为了避免破坏性更改,旧的
name参数仍然会被接受。
示例
假设您想为 Post 模型的 title 字段添加索引
定义单列索引(仅限关系数据库)
model Post {
id Int @id @default(autoincrement())
title String
content String?
@@index([title])
}
定义多列索引(仅限关系数据库)
model Post {
id Int @id @default(autoincrement())
title String
content String?
@@index([title, content])
}
定义带名称的索引(仅限关系数据库)
model Post {
id Int @id @default(autoincrement())
title String
content String?
@@index(fields: [title, content], name: "main_index")
}
在复合类型字段上定义索引(仅限关系数据库)
type Address {
street String
number Int
}
model User {
id Int @id
email String
address Address
@@index([address.number])
}
@relation
定义关系的元信息。了解更多。
备注
关系数据库
- 对应的数据库构造:
FOREIGN KEY/REFERENCES
MongoDB
- 如果您的模型主键在底层数据库中是
ObjectId类型,则主键和外键都必须具有@db.ObjectId属性
参数
| 名称 | 类型 | 必需 | 描述 | 示例 |
|---|---|---|---|---|
名称 | String | 有时(例如,为了消除关系的歧义) | 定义关系的名称。在多对多关系中,它还决定底层关系表的名称。 | "CategoryOnPost", "MyRelation" |
fields | FieldReference[] | 在已注释的关系字段上 | 当前模型的字段列表 | ["authorId"], ["authorFirstName, authorLastName"] |
引用 | FieldReference[] | 在已注释的关系字段上 | 关系另一端模型的字段列表 | ["id"], ["firstName, lastName"] |
map | String | 否 | 为数据库中的外键定义自定义名称。 | ["id"], ["firstName, lastName"] |
onUpdate | 枚举。有关值,请参阅引用操作类型。 | 否 | 定义当被引用模型中的被引用条目被更新时执行的引用操作。 | Cascade, NoAction |
onDelete | 枚举。有关值,请参阅引用操作类型。 | 否 | 定义当被引用模型中的被引用条目被删除时执行的引用操作。 | Cascade, NoAction |
可以省略 @relation 属性上 name 参数的名称(references 是必需的)
@relation(name: "UserOnPost", references: [id])
@relation("UserOnPost", references: [id])
// or
@relation(name: "UserOnPost")
@relation("UserOnPost")
签名
@relation(_ name: String?, fields: FieldReference[]?, references: FieldReference[]?, onDelete: ReferentialAction?, onUpdate: ReferentialAction?, map: String?)
对于 SQLite,签名变为
@relation(_ name: String?, fields: FieldReference[]?, references: FieldReference[]?, onDelete: ReferentialAction?, onUpdate: ReferentialAction?)
注意:在 3.0.0 版本之前,签名是
@relation(_ name: String?, fields: FieldReference[]?, references: FieldReference[]?)
示例
请参阅:@relation 属性。
@map
将 Prisma 架构中的字段名称或枚举值映射到数据库中具有不同名称的列或文档字段。如果您不使用 @map,则 Prisma 字段名称与列名或文档字段名称完全匹配。
请参阅使用自定义模型和字段名称以了解
@map和@@map如何更改生成的 Prisma Client。
备注
通用
@map不重命名数据库中的列/字段@map会更改生成客户端中的字段名称
MongoDB
您的 @id 字段必须包含 @map("_id")。例如
model User {
id String @default(auto()) @map("_id") @db.ObjectId
}
参数
| 名称 | 类型 | 必需 | 描述 | 示例 |
|---|---|---|---|---|
名称 | String | 是 | 数据库列(关系数据库)或文档字段(MongoDB)名称。 | "comments", "someFieldName" |
可以省略 @map 属性上 name 参数的名称
@map(name: "is_admin")
@map("users")
签名
@map(_ name: String)
示例
将 firstName 字段映射到名为 first_name 的列
- 关系型数据库
- MongoDB
model User {
id Int @id @default(autoincrement())
firstName String @map("first_name")
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
firstName String @map("first_name")
}
生成的客户端
await prisma.user.create({
data: {
firstName: "Yewande", // first_name --> firstName
},
});
将名为 ADMIN 的枚举映射到名为 admin 的数据库枚举
enum Role {
ADMIN @map("admin")
CUSTOMER
}
@@map
将 Prisma 架构模型名称映射到具有不同名称的表(关系数据库)或集合(MongoDB),或将枚举名称映射到数据库中不同的底层枚举。如果您不使用 @@map,则模型名称与表(关系数据库)或集合(MongoDB)名称完全匹配。
请参阅使用自定义模型和字段名称以了解
@map和@@map如何更改生成的 Prisma Client。
参数
| 名称 | 类型 | 必需 | 描述 | 示例 |
|---|---|---|---|---|
名称 | String | 是 | 数据库表(关系数据库)或集合(MongoDB)名称。 | "comments", "someTableOrCollectionName" |
可以省略 @@map 属性上 name 参数的名称
@@map(name: "users")
@@map("users")
签名
@@map(_ name: String)
示例
将 User 模型映射到名为 users 的数据库表/集合
- 关系型数据库
- MongoDB
model User {
id Int @id @default(autoincrement())
name String
@@map("users")
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
name String
@@map("users")
}
生成的客户端
await prisma.user.create({
// users --> user
data: {
name: "Yewande",
},
});
将 Role 枚举映射到数据库中名为 _Role 的原生枚举,其值映射到数据库中的小写值
enum Role {
ADMIN @map("admin")
CUSTOMER @map("customer")
@@map("_Role")
}
@updatedAt
自动存储记录上次更新的时间。如果您不自行提供时间,Prisma Client 将自动设置具有此属性的字段的值。
备注
- 与
DateTime字段兼容 - 在 Prisma ORM 级别实现
如果传递空更新子句,则 @updatedAt 值将保持不变。例如
await prisma.user.update({
where: {
id: 1,
},
data: {}, //<- Empty update clause
});
参数
不适用
签名
@updatedAt
示例
- 关系型数据库
- MongoDB
model Post {
id String @id
updatedAt DateTime @updatedAt
}
model Post {
id String @id @map("_id") @db.ObjectId
updatedAt DateTime @updatedAt
}
@ignore
将 @ignore 添加到您想要从 Prisma Client 中排除的字段(例如,您不希望 Prisma Client 用户更新的字段)。被忽略的字段将从生成的 Prisma Client 中排除。如果对没有 @default 的必填字段执行此操作,则模型的 create 方法将被禁用(因为数据库无法在没有该数据的情况下创建条目)。
备注
- 在 2.17.0 及更高版本中,Prisma ORM 会在内省时自动将
@ignore添加到引用无效模型的字段。
示例
以下示例演示了手动添加 @ignore 以从 Prisma Client 中排除 email 字段
model User {
id Int @id
name String
email String @ignore // this field will be excluded
}
@@ignore
将 @@ignore 添加到您想要从 Prisma Client 中排除的模型(例如,您不希望 Prisma 用户更新的模型)。被忽略的模型将从生成的 Prisma Client 中排除。
备注
示例
在以下示例中,Post 模型无效,因为它没有唯一标识符。使用 @@ignore 将其从生成的 Prisma Client API 中排除
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model Post {
id Int @default(autoincrement()) // no unique identifier
author User @relation(fields: [authorId], references: [id])
authorId Int
@@ignore
}
在以下示例中,Post 模型无效,因为它没有唯一标识符,并且 User 上的 posts 关系字段无效,因为它引用了无效的 Post 模型。在 Post 模型上使用 @@ignore,在 User 中的 posts 关系字段上使用 @ignore,以将模型和关系字段都从生成的 Prisma Client API 中排除
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model Post {
id Int @default(autoincrement()) // no unique identifier
author User @relation(fields: [authorId], references: [id])
authorId Int
@@ignore
}
model User {
id Int @id @default(autoincrement())
name String?
posts Post[] @ignore
}
@@schema
将 @@schema 添加到模型中,以指定数据库中的哪个架构应包含与该模型关联的表。在此处了解有关添加多个架构的更多信息。
多个数据库架构支持仅适用于 PostgreSQL、CockroachDB 和 SQL Server 连接器。
参数
| 名称 | 类型 | 必需 | 描述 | 示例 |
|---|---|---|---|---|
名称 | String | 是 | 数据库架构的名称。 | "base", "auth" |
可以省略 @@schema 属性上 name 参数的名称
@@schema(name: "auth")
@@schema("auth")
签名
@@schema(_ name: String)
示例
将 User 模型映射到名为 auth 的数据库架构
generator client {
provider = "prisma-client"
output = "./generated"
}
datasource db {
provider = "postgresql"
schemas = ["auth"]
}
model User {
id Int @id @default(autoincrement())
name String
@@schema("auth")
}
有关使用 multiSchema 功能的更多信息,请参阅本指南。
@shardKey
此功能要求您的 generator 上具有 shardKeys 预览功能标志
generator client {
provider = "prisma-client"
output = "../generated/prisma"
previewFeatures = ["shardKeys"]
}
@shardKey 属性仅与 PlanetScale 数据库兼容。它允许您在模型的字段上定义一个 分片键
model User {
id String @default(uuid())
region String @shardKey
}
@@shardKey
此功能要求您的 generator 上具有 shardKeys 预览功能标志
generator client {
provider = "prisma-client"
output = "../generated/prisma"
previewFeatures = ["shardKeys"]
}
@shardKey 属性仅与 PlanetScale 数据库兼容。它允许您在模型的多个字段上定义一个 分片键
model User {
id String @default(uuid())
country String
customerId String
@@shardKey([country, customerId])
}
属性函数
auto()
此函数仅适用于 MongoDB。
表示由数据库自动生成的默认值。
备注
MongoDB
用于为 @id 字段生成 ObjectId
id String @map("_id") @db.ObjectId @default(auto())
关系数据库
auto() 函数在关系数据库中不可用。
示例
生成 ObjectId(仅限 MongoDB)
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
name String?
}
autoincrement()
MongoDB 不支持
MongoDB 连接器不支持 autoincrement() 函数。
在底层数据库中创建整数序列,并根据序列将递增值分配给创建记录的 ID 值。
备注
-
在大多数数据库中与
Int兼容(在 CockroachDB 中为BigInt) -
在数据库级别实现,这意味着它在数据库模式中体现,并且可以通过内省识别。数据库实现
数据库 实现 PostgreSQL SERIAL类型MySQL AUTO_INCREMENT属性SQLite AUTOINCREMENT关键字CockroachDB SERIAL类型
示例
生成自增整数作为 ID(仅限关系数据库)
model User {
id Int @id @default(autoincrement())
name String
}
sequence()
仅 CockroachDB 支持
序列函数仅由 CockroachDB 连接器支持。
在底层数据库中创建整数序列,并根据序列将递增值分配给创建记录的值。
可选参数
| 参数 | 示例 |
|---|---|
虚拟 | @default(sequence(virtual))虚拟序列是不生成单调递增值,而是生成与内置函数 unique_rowid() 生成的值类似的序列。 |
缓存 | @default(sequence(cache: 20))在会话中缓存用于重用的序列值数量。缓存大小为 1 表示没有缓存,小于 1 的缓存大小无效。 |
增量 | @default(sequence(increment: 4))序列递增的新值。负数创建降序序列。正数创建升序序列。 |
最小值 | @default(sequence(minValue: 10))序列的新最小值。 |
最大值 | @default(sequence(maxValue: 3030303))序列的新最大值。 |
开始 | @default(sequence(start: 2))如果序列重新启动或序列达到 maxValue,序列的起始值。 |
示例
生成序列整数作为 ID
model User {
id Int @id @default(sequence(maxValue: 4294967295))
name String
}
cuid()
根据 cuid 规范生成全局唯一标识符。
如果您想使用 cuid2 值,您可以将 2 作为参数传递给 cuid 函数:cuid(2)。
备注
- 与
String兼容。 - 由 Prisma ORM 实现,因此在底层数据库架构中“不可见”。您仍然可以在使用内省时使用
cuid(),通过手动更改 Prisma 架构并生成 Prisma Client,在这种情况下,值将由 Prisma 的查询引擎生成。 - 由于
cuid()输出的长度根据 cuid 创建者未定义,因此安全的字段大小为 30 个字符,以允许足够的字符容纳非常大的值。如果您将字段大小设置为小于 30,然后由cuid()生成更大的值,您可能会看到 Prisma Client 错误,例如Error: The provided value for the column is too long for the column's type. - 对于 MongoDB:
cuid()不会生成有效的ObjectId。如果您想在底层数据库中使用ObjectId,可以使用@db.ObjectId语法。但是,如果您的_id字段不是ObjectId类型,您仍然可以使用cuid()。
示例
生成 cuid() 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(cuid())
name String
}
model User {
id String @id @default(cuid()) @map("_id")
name String
}
根据 cuid2 规范生成 cuid(2) 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(cuid(2))
name String
}
model User {
id String @id @default(cuid(2)) @map("_id")
name String
}
uuid()
根据 UUID 规范生成全局唯一标识符。Prisma ORM 支持版本 4(默认)和 7。
备注
- 与
String兼容。 - 由 Prisma ORM 实现,因此在底层数据库架构中“不可见”。您仍然可以在使用内省时使用
uuid(),通过手动更改 Prisma 架构并生成 Prisma Client,在这种情况下,值将由 Prisma ORM 的查询引擎生成。 - 对于关系数据库:如果您不想使用 Prisma ORM 的
uuid()函数,您可以使用dbgenerated的原生数据库函数。 - 对于 MongoDB:
uuid()不会生成有效的ObjectId。如果您想在底层数据库中使用ObjectId,可以使用@db.ObjectId语法。但是,如果您的_id字段不是ObjectId类型,您仍然可以使用uuid()。
示例
使用 UUID v4 生成 uuid() 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(uuid())
name String
}
model User {
id String @id @default(uuid()) @map("_id")
name String
}
使用 UUID v7 生成 uuid(7) 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(uuid(7))
name String
}
model User {
id String @id @default(uuid(7)) @map("_id")
name String
}
ulid()
根据 ULID 规范生成全局唯一词典排序标识符。
备注
ulid()将生成 128 位随机标识符,表示为 26 个字符长的字母数字字符串,例如:01ARZ3NDEKTSV4RRFFQ69G5FAV
示例
生成 ulid() 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(ulid())
name String
}
model User {
id String @id @default(ulid()) @map("_id")
name String
}
nanoid()
根据 Nano ID 规范生成值。nanoid() 接受一个介于 2 到 255 之间的整数值,该值指定生成 ID 值的长度,例如 nanoid(16) 将生成 16 个字符的 ID。如果您未向 nanoid() 函数提供值,则默认值为 21。
Nano ID 与 UUID v4(基于随机)非常相似。它在 ID 中具有相似数量的随机位(Nano ID 中为 126,UUID 中为 122),因此具有相似的冲突概率
要实现十亿分之一的重复机会,必须生成 103 万亿个版本 4 ID。
Nano ID 和 UUID v4 之间有两个主要区别
- Nano ID 使用更大的字母表,因此相似数量的随机位仅打包在 21 个符号中,而不是 36 个。
- Nano ID 代码比 uuid/v4 包小 4 倍:130 字节而不是 423 字节。
备注
- 与
String兼容。 - 由 Prisma ORM 实现,因此在底层数据库架构中“不可见”。您仍然可以在使用内省时使用
uuid(),通过手动更改 Prisma 架构并生成 Prisma Client,在这种情况下,值将由 Prisma ORM 的查询引擎生成。 - 对于 MongoDB:
nanoid()不会生成有效的ObjectId。如果您想在底层数据库中使用ObjectId,可以使用@db.ObjectId语法。但是,如果您的_id字段不是ObjectId类型,您仍然可以使用nanoid()。
示例
生成 21 个字符的 nanoid() 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(nanoid())
name String
}
model User {
id String @id @default(nanoid()) @map("_id")
name String
}
生成 16 个字符的 nanoid() 值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(nanoid(16))
name String
}
model User {
id String @id @default(nanoid(16)) @map("_id")
name String
}
now()
设置记录创建时的时间戳。
备注
通用
- 与
DateTime兼容
在 4.4.0 之前的版本中,如果您同时使用 @updatedAt,则如果您的数据库和应用程序具有不同的时区,则时间可能与 now() 值不同。发生这种情况是因为 @updatedAt 在 Prisma ORM 级别操作,而 now() 在数据库级别操作。
关系数据库
-
在数据库级别实现,这意味着它在数据库模式中体现,并且可以通过内省识别。数据库实现
数据库 实现 PostgreSQL CURRENT_TIMESTAMP及其别名,例如now()MySQL CURRENT_TIMESTAMP及其别名,例如now()SQLite CURRENT_TIMESTAMP和别名,例如date('now')CockroachDB CURRENT_TIMESTAMP及其别名,例如now()
MongoDB
- 在 Prisma ORM 级别实现
示例
记录创建时设置当前时间戳值
- 关系型数据库
- MongoDB
model User {
id String @id
createdAt DateTime @default(now())
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
createdAt DateTime @default(now())
}
dbgenerated(...)
表示 Prisma 架构中无法表达的默认值(例如 random())。
备注
关系数据库
-
兼容任何标量类型
-
在 2.21.0 及更高版本中不能是空字符串
dbgenerated("") -
在 2.17.0 及更高版本中接受
String值,这允许您 -
dbgenerated(...)中的字符串值可能与数据库返回的默认值不匹配,因为字符串等值可能会被显式强制转换(例如'hello'::STRING)。当存在不匹配时,Prisma Migrate 会指示仍需要迁移。您可以使用prisma db pull来推断正确的值以解决差异。(相关问题)
示例
为 Unsupported 类型设置默认值
circle Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle"))
覆盖受支持类型的默认值行为
您还可以使用 dbgenerated(...) 为支持的类型设置默认值。例如,在 PostgreSQL 中,您可以在数据库级别生成 UUID,而不是依赖 Prisma ORM 的 uuid()
model User {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
id String @id @default(uuid()) @db.Uuid
test String?
}
gen_random_uuid() 是一个 PostgreSQL 函数。要在 PostgreSQL 12.13 及更早版本中使用它,您必须启用 pgcrypto 扩展。
在 Prisma ORM 4.5.0 及更高版本中,您可以使用 postgresqlExtensions 预览功能在 Prisma schema 中声明 pgcrypto 扩展。
属性参数类型
FieldReference[]
一个字段名称数组:[id]、[firstName, lastName]
String
用双引号引起来的可变长度文本:""、"Hello World"、"Alice"
Expression
一个可以由 Prisma ORM 评估的表达式:42.0、""、Bob、now()、cuid()
enum
不支持 Microsoft SQL Server
Microsoft SQL Server 连接器不支持 enum 类型。
定义一个枚举。
备注
- 枚举由 PostgreSQL 和 MySQL 本机支持
- 枚举在 SQLite 和 MongoDB 的 Prisma ORM 级别实现和强制执行
命名约定
- 枚举名称必须以字母开头(它们通常以 PascalCase 拼写)
- 枚举必须使用单数形式(例如
Role而不是role、roles或Roles)。 - 必须符合以下正则表达式:
[A-Za-z][A-Za-z0-9_]*
示例
指定具有两个可能值的 enum
- 关系型数据库
- MongoDB
enum Role {
USER
ADMIN
}
model User {
id Int @id @default(autoincrement())
role Role
}
enum Role {
USER
ADMIN
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
role Role
}
指定具有两个可能值的 enum 并设置默认值
- 关系型数据库
- MongoDB
enum Role {
USER
ADMIN
}
model User {
id Int @id @default(autoincrement())
role Role @default(USER)
}
enum Role {
USER
ADMIN
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
role Role @default(USER)
}
type
复合类型仅适用于 MongoDB。
复合类型在 3.12.0 及更高版本中可用,在 3.10.0 及更高版本中,如果您启用 mongodb 预览功能标志,则也可用。
定义复合类型。
命名约定
类型名称必须
- 以字母开头(它们通常以 PascalCase 拼写)
- 遵守以下正则表达式:
[A-Za-z][A-Za-z0-9_]*
示例
定义一个带有 Photo 复合类型列表的 Product 模型
model Product {
id String @id @default(auto()) @map("_id") @db.ObjectId
name String
photos Photo[]
}
type Photo {
height Int
width Int
url String
}