Scheme 语法
定义一个 model 模型
注意
模型的每条记录都必须是唯一可识别的.
所以你必须为每个模型定义至少以下属性之一
注意
- @unique
- @@unique
- @id
- @@id
命名约定
模型名称必须遵循以下正则表达式
[A-Za-Z][A-Za-z0-9__]*模型名称必须以字母开头
模型名称应使用单数形式 比如
User而不是Users或者users或者userPrisma 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
}