Prisma schema 参考
datasource
在 Prisma schema 中定义一个数据源。
字段
一个 datasource
块接受以下字段
名称 | 必需 | 类型 | 描述 |
---|---|---|---|
provider | 是 | 字符串 (postgresql , mysql , sqlite , sqlserver , mongodb , cockroachdb ) | 描述要使用哪个数据源连接器。 |
url | 是 | 字符串 (URL) | 包含身份验证信息的连接 URL。大多数连接器使用数据库提供的语法。 |
shadowDatabaseUrl | 否 | 字符串 (URL) | Prisma Migrate 使用的影子数据库的连接 URL。允许你使用云托管的数据库作为影子数据库。 |
directUrl | 否 | 字符串 (URL) | 用于直接连接数据库的连接 URL。 如果在 url 参数中使用连接池 URL(例如,如果使用Prisma Accelerate或 pgBouncer),则需要直接连接到数据库的 Prisma CLI 命令将使用 directUrl 参数中的 URL。从 5.1.0 版本开始,Prisma Studio 支持 directUrl 属性。使用Prisma Postgres数据库时,不需要 directUrl 属性。 |
relationMode | 否 | 字符串 (foreignKeys , prisma ) | 设置引用完整性是由数据库中的外键强制执行还是在 Prisma Client 中模拟。 在 3.1.1 及更高版本中为预览版。该字段在 4.5.0 及更高版本中命名为 relationMode ,之前名为 referentialIntegrity 。 |
extensions | 否 | 字符串列表 (PostgreSQL 扩展名称) | 允许你在你的 schema 中表示 PostgreSQL 扩展。仅在 Prisma ORM 4.5.0 及更高版本中为 PostgreSQL 提供预览版。 |
以下 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 连接字符串的更多信息 here。
通过环境变量指定 PostgreSQL 数据源
在此示例中,目标数据库可通过以下凭据获得
- 用户:
johndoe
- 密码:
mypassword
- 主机:
localhost
- 端口:
5432
- 数据库名称:
mydb
- Schema 名称:
public
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
当运行需要数据库连接 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 连接字符串的更多信息 here。
指定一个 MongoDB 数据源
- 用户:
root
- 密码:
password
- 主机:
cluster1.test1.mongodb.net
- 端口:N/A
- 数据库名称:
testing
datasource db {
provider = "mongodb"
url = "mongodb+srv://root:[email protected]/testing?retryWrites=true&w=majority"
}
在此处了解有关 MongoDB 连接字符串的更多信息 here。
指定一个 SQLite 数据源
在此示例中,目标数据库位于名为 dev.db
的文件中
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
在此处了解有关 SQLite 连接字符串的更多信息 here。
指定一个 CockroachDB 数据源
在此示例中,目标数据库可通过以下凭据获得
- 用户:
johndoe
- 密码:
mypassword
- 主机:
localhost
- 端口:
26257
- 数据库名称:
mydb
- Schema 名称:
public
datasource db {
provider = "cockroachdb"
url = "postgresql://johndoe:mypassword@localhost:26257/mydb?schema=public"
}
连接字符串的格式与 PostgreSQL 相同。在此处了解有关 PostgreSQL 连接字符串的更多信息 here。
generator
在 Prisma schema 中定义一个生成器。
字段
一个 generator
块接受以下字段
名称 | 必需 | 类型 | 描述 |
---|---|---|---|
provider | 是 | 字符串(文件路径)或枚举(prisma-client-js ) | 描述要使用哪个生成器。这可以指向实现生成器的文件或直接指定内置生成器。 |
output | 否 | 字符串(文件路径) | 确定生成的客户端的位置,了解更多。默认:node_modules/.prisma/client |
previewFeatures | 否 | 枚举列表 | 使用智能感知查看当前可用的预览功能列表(在 Visual Studio Code 中按 Ctrl+Space )默认:无 |
engineType | 否 | 枚举(library 或 binary ) | 定义要下载和使用的查询引擎类型。默认:library |
binaryTargets | 否 | 枚举列表(见下文) | 指定 Prisma Client 将在其上运行的操作系统,以确保查询引擎的兼容性。默认:native |
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 不同,在 PostgreSQL 中,int 是 int4 的别名 |
bigserial | serial8 | @db.Int8 @default(autoincrement()) |
客户端
Client | 类型 | 描述 |
---|---|---|
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
(刻度),存储在小数点右侧的十进制位数。
客户端
Client | 类型 | 描述 |
---|---|---|
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,该 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 |
客户端
Client | 类型 | 描述 |
---|---|---|
Prisma Client JS | Uint8Array | 请参阅使用 Bytes 的示例 |
Prisma Client JS (v6 之前) | Buffer | 请参阅使用 Bytes 的示例 |
Unsupported
MongoDB 不支持
MongoDB 连接器 不支持 Unsupported
类型。
Unsupported
类型是在 2.17.0 中引入的,它允许你在 Prisma 模式中表示 Prisma Client 不支持的数据类型。 在内省期间,可以使用 prisma db pull
创建 Unsupported
类型的字段,或者手动编写,并使用 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 | 否 | 布尔值 | 定义 ID 是群集索引还是非群集索引。默认为 true 。仅限 SQL Server。在 3.13.0 及更高版本中处于预览状态,在 4.0.0 及更高版本中正式可用。 |
签名
@id(map: String?, length: number?, sort: String?, clustered: Boolean?)
注意:在 4.0.0 版本之前,或启用
extendedIndexes
预览功能的 3.5.0 版本中,签名是@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: "[email protected]",
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
- 可以使用
@default
属性进行注释,该属性使用函数来自动生成 ID - 不能是可选的
- 可以在任何标量字段(
String
、Int
、enum
)上定义 - 不能在关系字段上定义
- Prisma Client 中复合 ID 字段的名称具有以下模式:
field1_field2_field3
参数
名称 | 必需 | 类型 | 描述 |
---|---|---|---|
fields | 是 | FieldReference[] | 字段名称列表 - 例如,["firstname", "lastname"] |
name | 否 | 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 | 否 | 布尔值 | 定义 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: "[email protected]",
},
},
},
});
@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 | 否 | 布尔值 | 定义约束是聚集的还是非聚集的。默认为 false 。仅限 SQL Server。在 3.13.0 及更高版本中处于预览状态,在 4.0.0 及更高版本中正式可用。 |
- ¹某些索引和字段类型可能需要。
签名
@unique(map: String?, length: number?, sort: String?)
注意:在 4.0.0 版本之前,或启用
extendedIndexes
预览功能的 3.5.0 版本中,签名是@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
可以为null
model 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"] 。字段必须是强制性的 - 请参阅备注。 |
name | 否 | 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 | 否 | 布尔值 | 定义约束是聚集的还是非聚集的。默认为 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 版本之前,或在启用了
extendedIndexes
预览功能的 3.5.0 版本之前,签名是@@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 模式提供。这些选项包括
- PostgreSQL 和 CockroachDB
- 将索引字段定义为表达式(例如,
CREATE INDEX title ON public."Post"((lower(title)) text_ops);
) - 使用
WHERE
定义部分索引 - 使用
CONCURRENTLY
并发创建索引
- 将索引字段定义为表达式(例如,
- PostgreSQL 和 CockroachDB
虽然您无法在 Prisma 模式中配置这些选项,但您仍然可以直接在数据库级别配置它们。
MongoDB
参数
名称 | 必需 | 类型 | 描述 |
---|---|---|---|
fields | 是 | FieldReference[] | 字段名称列表 - 例如,["firstname", "lastname"] |
name | 否 | 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 | 否 | 布尔值 | 定义索引是聚集索引还是非聚集索引。默认为 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 及更高版本中正式可用。 |
操作符 | 否 | 标识符 或 函数 | 允许您为某些索引类型定义索引运算符。 仅限 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
属性
参数
名称 | 类型 | 必需 | 描述 | 示例 |
---|---|---|---|---|
name | String | 有时(例如,为了消除关系的歧义) | 定义关系的名称。在 m-n 关系中,它还确定底层关系表的名称。 | "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
}
参数
名称 | 类型 | 必需 | 描述 | 示例 |
---|---|---|---|---|
name | 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。
参数
名称 | 类型 | 必需 | 描述 | 示例 |
---|---|---|---|---|
name | 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 级别实现
如果您还使用 now()
,则如果您的数据库和应用程序具有不同的时区,则时间可能与 @updatedAt
值不同。 发生这种情况是因为 @updatedAt
在 Prisma ORM 级别运行,而 now()
在数据库级别运行。
如果您传递一个空的更新子句,则 @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
以将 email
字段从 Prisma Client 中排除
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
要使用此属性,您必须启用 multiSchema
预览功能。 目前,PostgreSQL、CockroachDB 和 SQL Server 连接器支持多数据库模式。
将 @@schema
添加到模型以指定数据库中的哪个模式应包含与该模型关联的表。
参数
名称 | 类型 | 必需 | 描述 | 示例 |
---|---|---|---|---|
name | String | 是 | 数据库模式的名称。 | "base" , "auth" |
可以省略 @@schema
属性中 name
参数的名称
@@schema(name: "auth")
@@schema("auth")
签名
@@schema(_ name: String)
示例
将 User
模型映射到名为 auth
的数据库模式
generator client {
provider = "prisma-client-js"
previewFeatures = ["multiSchema"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
schemas = ["auth"]
}
model User {
id Int @id @default(autoincrement())
name String
@@schema("auth")
}
有关使用 multiSchema
功能的更多信息,请参阅本指南。
属性函数
auto()
表示由数据库自动生成的默认值。
备注
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 连接器支持。
在底层数据库中创建一系列整数,并根据序列将递增的值分配给创建的记录的值。
可选参数
参数 | 示例 |
---|---|
virtual | @default(sequence(virtual)) 虚拟序列是不生成单调递增值的序列,而是生成类似于内置函数 unique_rowid() 生成的值。 |
cache | @default(sequence(cache: 20)) 要在会话中缓存以供重用的序列值的数量。 缓存大小为 1 表示没有缓存,而小于 1 的缓存大小无效。 |
increment | @default(sequence(increment: 4)) 序列递增的新值。负数创建降序序列。正数创建升序序列。 |
minValue | @default(sequence(minValue: 10)) 序列的最小值。 |
maxValue | @default(sequence(maxValue: 3030303)) 序列的最大值。 |
start | @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 实现,因此在底层数据库模式中不可见。当使用 内省 时,你仍然可以通过手动更改你的 Prisma 模式 和 生成 Prisma Client 来使用
cuid()
,在这种情况下,这些值将由 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 实现,因此在底层数据库模式中不可见。当使用 内省 时,你仍然可以通过手动更改你的 Prisma 模式 和 生成 Prisma Client 来使用
uuid()
,在这种情况下,这些值将由 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 实现,因此在底层数据库模式中不可见。当使用 内省 时,你仍然可以通过手动更改你的 Prisma 模式 和 生成 Prisma Client 来使用
uuid()
,在这种情况下,这些值将由 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
兼容
如果你还使用 @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 模式中声明 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
类型。
定义一个 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
}