Scheme 语法
定义一个 model 模型
注意
模型的每条记录都必须是唯一可识别的.
所以你必须为每个模型定义至少以下属性之一
注意
- @unique
- @@unique
- @id
- @@id
命名约定
模型名称必须遵循以下正则表达式
[A-Za-Z][A-Za-z0-9__]*
模型名称必须以字母开头
模型名称应使用单数形式 比如
User
而不是Users
或者users
或者user
Prisma ORM 有许多保留字供内部使用,因此不能用作模型名称
举例
model User {
email String @unique // `email` can not be optional because it's the only unique field on the model
name String?
}
model 字段
Mysql 举例
原生数据库类型 | 原生数据库类型属性 |
---|---|
VARCHAR(x) | @db.VarChar(x) |
TEXT | @db.Text |
CHAR(x) | @db.Char(x) |
TINYTEXT | @db.TinyText |
MEDIUMTEXT | @db.MediumText |
LONGTEXT | @db.LongText |
- 注意
原生数据库类型 | 原生数据库类型属性 | 备注 |
---|---|---|
TINYINT(1) | @db.TinyInt(1) | 如果最大长度大于 1(例如 TINYINT(2))或默认值不是 1、0 或 NULL,则 TINYINT 映射到 Int。TINYINT(1) 映射到 Boolean。 |
BIT(1) | @db.Bit | 无 |
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 |
model 字段类型
String
对应 Mysql 类型
原生数据库类型 | 原生数据库类型属性 |
---|---|
VARCHAR(x) | @db.VarChar(x) |
TEXT | @db.Text |
CHAR(x) | @db.Char(x) |
TINYTEXT | @db.TinyText |
MEDIUMTEXT | @db.MediumText |
LONGTEXT | @db.LongText |
Boolean
连接器 | 默认映射 |
---|---|
PostgreSQL | boolean |
SQL | Server bit |
MySQL | TINYINT(1) |
MongoDB | Bool |
SQLite | INTEGER |
CockroachDB | BOOL |
Int
- 默认类型映射
连接器 | 默认映射 |
---|---|
PostgreSQL | integer |
SQL Server | int |
MySQL | INT |
MongoDB | Int |
SQLite | INTEGER |
CockroachDB | INT |
BigInt
- 默认类型映射
连接器 | 默认映射 |
---|---|
PostgreSQL | bigint |
SQL Server | int |
MySQL | BIGINT |
MongoDB | Long |
SQLite | INTEGER |
CockroachDB | INTEGER |
浮点型
连接器 | 默认映射 |
---|---|
PostgreSQL | double precision |
SQL Server | float(53) |
MySQL | DOUBLE |
MongoDB | Double |
SQLite | REAL |
CockroachDB | DOUBLE PRECISION |
Decimal
连接器 | 默认映射 |
---|---|
PostgreSQL | decimal(65,30) |
SQL Server | decimal(32,16) |
MySQL | DECIMAL(65,30) |
MongoDB | 不支持 |
SQLite | DECIMAL |
CockroachDB | DECIMAL |
DateTime
Prisma Client 将所有 DateTime 作为原生的 Date 对象返回。
目前 Prisma 不支持 Mysql 中 零日期 (0000-00-00 00:00:00, 0000-00-00, 00:00:00)
目前 DateTime 不允许您将 DateTime 值作为字符串传入, 否则会产生运行错误.
比如 (即 new Date('2024-12-04')
而不是 '2024-12-04'
)
连接器 | 默认映射 |
---|---|
PostgreSQL | timestamp(3) |
SQL Server | datetime2 |
MySQL | DATETIME(3) |
MongoDB | Timestamp |
SQLite | NUMERIC |
CockroachDB | TIMESTAMP |
- mysql
原生数据库类型 | 原生数据库类型属性 |
---|---|
DATETIME(x) | @db.DateTime(x) |
DATE(x) | @db.Date(x) |
TIME(x) | @db.Time(x) |
TIMESTAMP(x) | @db.Timestamp(x) |
Json
一个 JSON 对象
连接器 | 默认映射 |
---|---|
PostgreSQL | jsonb |
SQL Server | 不支持 |
MySQL | JSON |
MongoDB | 一个有效的 BSON 对象 |
SQLite | JSONB |
CockroachDB | JSONB |
- Mysql 使用
连接器 | 默认映射 |
---|---|
JSON | @db.Json |
Bytes
- Bytes
默认类型
连接器 | 默认映射 |
---|---|
PostgreSQL | bytea |
SQL Server | varbinary |
MySQL | LONGBLOB |
MongoDB | BinData |
SQLite | BLOB |
CockroachDB | BYTES |
model 字段修饰符
[]
修饰符
使字段成为列表
model User {
id Int @id @default(autoincrement())
favoriteColors String[] @default(["red", "blue", "green"])
}
?
修饰符
非必填
model User {
id Int @id @default(autoincrement())
name String?
}
属性
属性修改字段
或者模块(models
)的行为,有两种方法可以向数据模型添加属性:
字段使用前缀
@
模块使用后缀
@@
有些属性可以带参数并且参数必须有参数名,但大多数情况下,可以忽略掉参数名
注意
- 签名中前导下划线()表示可以省略参数名_
@id
主键
不能定义在关系字段上
不能是可选的
对应的数据库类型:
Primary Key
可以使用
@default()
进行注解
autoincrement()
自增uuid()
是基于时间戳,MAC 地址,随机数等多种因素造成的. 理论上全球范围内不可能重复cuid()
- 仅仅关系型数据库
model User {
id Int @id @default(autoincrement())
name String
}
- cuid
model User {
id String @id @default(cuid())
name String
}
- uuid
model User {
id String @id @default(uuid())
name String
}
@@id
多字段合并为主键
- 对应数据库类型:
PRIMARY KEY
model User {
firstName String
lastName String
email String @unique
isAdmin Boolean @default(false)
@@id([firstName, lastName])
}
联合主键 把 firstName 和 lastName 合并为主键
创建用户时,必须提供 firstName
和 lastName
的唯一组合:
@default
默认值可以是静态值(4,hello
)或以下函数之一
autoincrement() 自增
dbgenerated() 表示无法在 Prisma 中表示的默认值
cuid() 基于 cuid 规范生成全局唯一标识符。
uuid() 是基于时间戳,MAC 地址,随机数等多种因素造成的. 理论上全球范围内不可能重复
now() 表示当前时间
enum Role {
USER
ADMIN
}
model User {
id Int @id @default(autoincrement())
ccc string @default(dbgenerated())
ddd string @default(cuid())
eee string @default(uuid())
fff string @default(now())
ggg string @default("hello")
hhh string @default(4)
iii string @default(true)
jjj string @default(Role.USER)
email String @unique
profileViews Int @default(0)
aaa Float @default(1.1)
bbb Decimal @default(22.99)
name String @default("")
isAdmin Boolean @default(false)
data DateTime @default("2020-03-19T14:21:00+02:00")
secret Bytes @default("SGVsbG8gd29ybGQ=")
role Role @default(USER)
}
@unique
如果一个 model 上面不存在
@id
或者@@id
那么必须有一个使用@unique
字段一个模型可以有任意多个唯一约束
可以在任何标量字段上定义
不能应用在关系字段
model User {
email String @unique
name String
}
- 使用
model User {
token String @unique @default(cuid())
name String
}
@@unique
- 符合唯一约束
model User {
id Int @default(autoincrement())
firstName String
lastName String
isAdmin Boolean @default(false)
@@unique([firstName, lastName])
}
@@index
创建数据库索引
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(fields: [title, content], name: "main_index")
}
@relation
model emp {
id Int @id @default(autoincrement())
name String @db.VarChar(50)
age Int?
job String? @db.VarChar(20)
salary Int?
entrydate DateTime? @db.Date
managerid Int?
dept_id Int?
dept dept? @relation(fields: [dept_id], references: [id], onDelete: NoAction, onUpdate: NoAction, map: "fk_emp_dept_id")
@@index([dept_id], map: "fk_emp_dept_id")
}
@map
别名 map 里面的名字就是数据库里面的名字
下面这就是模型就是 firstName 但是到正式数据库字段名称就是first_name
model User {
id Int @id @default(autoincrement())
firstName String @map("first_name")
}
@@map
映射模型到数据库表的名字
模型的就是 User 数据库对应的表就是users
model User {
id Int @id @default(autoincrement())
name String
@@map("users")
}
@updateAt
自动存储记录上次更新的时间。如果您自己不提供时间,Prisma 客户端将自动为具有此属性的字段设置值。
model Post {
id String @id
updatedAt DateTime @updatedAt
}
@ignore
忽略字段
model Product {
id Int @default(autoincrement())
tags Tag[] @ignore
}
忽略表
model Tag {
id String? @db.VarChar
@@ignore
}
autoincrement()
自增类型
model User {
id Int @id @default(autoincrement())
name String
}
cuid()
基于 cuid 规范生成全局唯一标识符。
model User {
id String @id @default(cuid())
name String
}
uuid()
基于时间戳,MAC 地址,随机数等多种因素造成的. 理论上全球范围内不可能重复
model User {
id String @id @default(uuid())
name String
}
now()
设置创建记录的时间戳
model User {
id String @id @default(now())
name String
}
dbgenerated()
表示无法在 Prisma 中表示的默认值
model User {
id String @id @default(dbgenerated())
name String
}