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。directUrl 属性从 Prisma Studio 版本 5.1.0 开始支持。 |
relationMode | 否 | 字符串(foreignKeys 、prisma ) | 设置 参照完整性 是由数据库中的外键强制执行还是在 Prisma Client 中模拟。 在版本 3.1.1 及更高版本中预览。该字段在版本 4.5.0 及更高版本中被命名为 relationMode ,以前被命名为 referentialIntegrity 。 |
extensions | 否 | 字符串列表(PostgreSQL 扩展名称) | 允许您 在您的 schema 中表示 PostgreSQL 扩展。在 Prisma ORM 版本 4.5.0 及更高版本中,仅针对 PostgreSQL 预览可用。 |
以下提供商可用
备注
- 您只能在 schema 中拥有 一个
datasource
块。 datasource db
是约定 - 但是,您可以给您的数据源任何名称 - 例如,datasource mysql
或datasource data
。
示例
指定 PostgreSQL 数据源
在此示例中,目标数据库可使用以下凭据使用
- 用户:
johndoe
- 密码:
mypassword
- 主机:
localhost
- 端口:
5432
- 数据库名称:
mydb
- 模式名称:
public
datasource db {
provider = "postgresql"
url = "postgresql://johndoe:mypassword@localhost:5432/mydb?schema=public"
}
了解有关 PostgreSQL 连接字符串的更多信息 此处。
通过环境变量指定 PostgreSQL 数据源
在此示例中,目标数据库可使用以下凭据使用
- 用户:
johndoe
- 密码:
mypassword
- 主机:
localhost
- 端口:
5432
- 数据库名称:
mydb
- 模式名称:
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 连接字符串的更多信息 此处。
指定 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 连接字符串的更多信息 此处。
指定 SQLite 数据源
在此示例中,目标数据库位于名为 dev.db
的文件中
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
了解有关 SQLite 连接字符串的更多信息 此处。
指定 CockroachDB 数据源
在此示例中,目标数据库可使用以下凭据使用
- 用户:
johndoe
- 密码:
mypassword
- 主机:
localhost
- 端口:
26257
- 数据库名称:
mydb
- 模式名称:
public
datasource db {
provider = "cockroachdb"
url = "postgresql://johndoe:mypassword@localhost:26257/mydb?schema=public"
}
连接字符串的格式与 PostgreSQL 相同。了解有关 PostgreSQL 连接字符串的更多信息 此处。
generator
在 Prisma schema 中定义一个 生成器。
字段
generator
块接受以下字段
名称 | 必需 | 类型 | 描述 |
---|---|---|---|
provider | 是 | 字符串(文件路径)或枚举(prisma-client-js ) | 描述要使用哪个 生成器。这可以指向实现生成器的文件,也可以直接指定内置生成器。 |
output | 否 | 字符串(文件路径) | 确定生成客户端的位置,了解更多。默认:node_modules/.prisma/client |
previewFeatures | 否 | 枚举列表 | 使用 intellisense 查看当前可用的预览功能列表(在 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(Alpine 在 x86_64 架构上)
构建操作系统 | 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(Alpine 在 ARM64 架构上)
构建操作系统 | 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"
}
请注意,由于它使用 output
、engineType
和 binaryTargets
的默认值(并隐式地使用 previewFeatures
),因此上述 generator
定义等效于以下内容
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 |
年份 | @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 |
---|
数字 |
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()) |
客户端
客户端 | 类型 | 描述 |
---|---|---|
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 |
---|
数字 |
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 客户端将所有
DateTime
返回为本机 Date 对象。 - 目前,Prisma ORM 不支持 零日期(
0000-00-00 00:00:00
、0000-00-00
、00:00:00
)在 MySQL 中。
默认类型映射
连接器 | 默认映射 |
---|---|
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 |
---|
日期 |
Json
一个 JSON 对象。
默认类型映射
连接器 | 默认映射 |
---|---|
PostgreSQL | jsonb |
SQL Server | 不支持 |
MySQL | JSON |
MongoDB | 一个有效的 BSON 对象(宽松模式) |
SQLite | 不支持 |
CockroachDB | JSONB |
PostgreSQL
原生数据库类型 | 原生数据库类型属性 | 说明 |
---|---|---|
json | @db.Json | |
jsonb | @db.JsonB |
MySQL
原生数据库类型 | 原生数据库类型属性 | 说明 |
---|---|---|
JSON | @db.Json |
MongoDB
Microsoft SQL Server
Microsoft SQL Server 没有专门的 JSON 数据类型 - 但是,有一些 内置函数用于读取和修改 JSON.
原生数据库类型 | 原生数据库类型属性 |
---|---|
JSON | @db.NVarChar |
SQLite
不支持
CockroachDB
原生数据库类型 | 原生数据库类型属性 | 说明 |
---|---|---|
JSON | JSONB | @db.JsonB |
Clients
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 |
Clients
客户端 | 类型 | 描述 |
---|---|---|
Prisma Client JS | Buffer | 查看 Buffer 的使用示例 |
Unsupported
MongoDB 不支持
MongoDB 连接器MongoDB 连接器 不支持 Unsupported
类型。
Unsupported
类型是在 2.17.0 中引入的,允许您在 Prisma 模式中表示 Prisma Client 不支持的数据类型。Unsupported
类型的字段可以在使用 prisma db pull
进行内省时创建,也可以手动编写,并使用 Prisma Migrate 或 db push
在数据库中创建。
备注
-
生成的客户端中不提供具有
Unsupported
类型的字段。 -
如果模型包含一个**必需的**
Unsupported
类型,则prisma.model.create(..)
、prisma.model.update(...)
和prisma.model.upsert(...)
在 Prisma Client 中不可用。 -
当您内省包含不支持类型的数据库时,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,您必须 -
autoincrement()
**不受支持**
参数
名称 | 必需 | 类型 | 描述 |
---|---|---|---|
map | 否 | String | 数据库中底层主键约束的名称。 MySQL 或 MongoDB 不支持。 |
length | 否 | 数字 | 允许您指定要索引的值子部分的最大长度。 仅适用于 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")
没有默认值的单字段 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 | 否 | 数字 | 允许您指定要索引的值子部分的最大长度。 仅适用于 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 模式中无法表示的默认值将由 `dbgenerated()` 函数 表示。
- Prisma 模式中不允许在关联字段上使用默认值。但请注意,您仍然可以在支持关联的字段上定义默认值(在 `@relation` 属性的 `fields` 参数中列出的字段)。支持关联的字段上的默认值意味着关联会自动为您填充。
- 默认值可以与支持原生支持它们的数据库中的 标量列表 一起使用。
关系数据库
- 对应数据库结构:`DEFAULT`
- 默认值可以是静态值(`4`、`“hello”`)或以下 函数 之一
autoincrement()
- `sequence()`(仅限 CockroachDB)
dbgenerated(...)
cuid()
uuid()
now()
- 使用 内省 时,Prisma 模式中无法表示的默认值将由 `dbgenerated(...)` 函数 表示。
- Prisma 模式中不允许在关联字段上使用默认值。但请注意,您仍然可以在支持关联的字段上定义默认值(在 `@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 | 否 | 数字 | 允许您指定要索引的值子部分的最大长度。 仅适用于 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`
- 如果它代表了没有
@id
/@@id
的模型上的唯一约束,则需要@@unique
块 - 添加唯一约束会自动在指定列上添加相应的唯一索引
MongoDB
- 在 MongoDB 中由复合索引强制执行
@@unique
块不能用作模型的唯一标识符 - MongoDB 需要@id
字段
参数
名称 | 必需 | 类型 | 描述 |
---|---|---|---|
fields | 是 | FieldReference[] | 字段名称列表 - 例如,["firstname", "lastname"] 。字段必须是必填的 - 请参见备注。 |
name | 否 | String | 字段唯一组合的名称 - 默认值为fieldName1_fieldName2_fieldName3 |
map | 否 | String | |
length | 否 | 数字 | 允许您指定要索引的值子部分的最大长度。 仅适用于 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 版本之前,或者在 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 模式提供。这些包括
- 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 | 否 | 数字 | 允许您指定要索引的值子部分的最大长度。 仅适用于 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 级别实现
参数
N/A
签名
@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
要使用此属性,您必须启用 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 上可用。
表示由数据库自动生成的默认值。
备注
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 支持
sequence 函数仅由 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
规范生成全局唯一标识符。
备注
- 与
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
- 使用@db.ObjectId
语法,如果您想在底层数据库中使用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
}
uuid()
根据 UUID 规范(版本 4,随机)生成全局唯一标识符。
备注
- 与
String
兼容 - 由 Prisma ORM 实现,因此在底层数据库模式中不可见。在使用 内省 时,您仍然可以使用
uuid()
,方法是通过 手动更改您的 Prisma 模式 并 生成 Prisma Client,在这种情况下,值将由 Prisma ORM 的 查询引擎 生成。
注意(关系型数据库):如果您不想使用 Prisma ORM 的 uuid()
函数,可以使用 带有 dbgenerated
的本机数据库函数。
MongoDB
uuid()
不会生成有效的ObjectId
- 使用@db.ObjectId
语法,如果您想在底层数据库中使用ObjectId
。但是,如果您的_id
字段不是ObjectId
类型,您仍然可以使用uuid()
。
示例
生成 uuid()
值作为 ID
- 关系型数据库
- MongoDB
model User {
id String @id @default(uuid())
name String
}
model User {
id String @id @default(uuid()) @map("_id")
name String
}
now()
设置创建记录时的的时间戳。
备注
一般
- 与
DateTime
兼容
关系型数据库
-
在数据库级别实现,这意味着它体现在数据库架构中,可以通过内省识别。数据库实现
数据库 实现 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(...)
中的字符串值可能与 DB 返回的默认值不匹配,因为字符串等值可能会被显式强制转换(例如'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
SQLite 和 Microsoft SQL Server 不支持
SQLite 连接器 和 Microsoft SQL Server 连接器 不支持 `enum` 类型。
定义一个 枚举 。
备注
- 枚举在 PostgreSQL 和 MySQL 中得到原生支持
- 枚举在 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 及更高版本中可用,如果您启用了 `mongodb` 预览功能标志,则在 3.10.0 及更高版本中可用。
定义一个 复合类型 。
命名约定
类型名称必须
- 以字母开头(它们通常用 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
}