Skip to content

Scheme 语法

定义一个 model 模型

注意

  1. 模型的每条记录都必须是唯一可识别的.

  2. 所以你必须为每个模型定义至少以下属性之一

注意

  1. @unique
  2. @@unique
  3. @id
  4. @@id

命名约定

  • 模型名称必须遵循以下正则表达式 [A-Za-Z][A-Za-z0-9__]*

  • 模型名称必须以字母开头

  • 模型名称应使用单数形式 比如 User 而不是 Users或者users或者user

  • Prisma ORM 有许多保留字供内部使用,因此不能用作模型名称

举例

ts
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

连接器默认映射
PostgreSQLboolean
SQLServer bit
MySQLTINYINT(1)
MongoDBBool
SQLiteINTEGER
CockroachDBBOOL

Int

  • 默认类型映射
连接器默认映射
PostgreSQLinteger
SQL Serverint
MySQLINT
MongoDBInt
SQLiteINTEGER
CockroachDBINT

BigInt

  • 默认类型映射
连接器默认映射
PostgreSQLbigint
SQL Serverint
MySQLBIGINT
MongoDBLong
SQLiteINTEGER
CockroachDBINTEGER

浮点型

连接器默认映射
PostgreSQLdouble precision
SQL Serverfloat(53)
MySQLDOUBLE
MongoDBDouble
SQLiteREAL
CockroachDBDOUBLE PRECISION

Decimal

连接器默认映射
PostgreSQLdecimal(65,30)
SQL Serverdecimal(32,16)
MySQLDECIMAL(65,30)
MongoDB不支持
SQLiteDECIMAL
CockroachDBDECIMAL

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'

连接器默认映射
PostgreSQLtimestamp(3)
SQL Serverdatetime2
MySQLDATETIME(3)
MongoDBTimestamp
SQLiteNUMERIC
CockroachDBTIMESTAMP
  • mysql
原生数据库类型原生数据库类型属性
DATETIME(x)@db.DateTime(x)
DATE(x)@db.Date(x)
TIME(x)@db.Time(x)
TIMESTAMP(x)@db.Timestamp(x)

Json

一个 JSON 对象

连接器默认映射
PostgreSQLjsonb
SQL Server不支持
MySQLJSON
MongoDB一个有效的 BSON 对象
SQLiteJSONB
CockroachDBJSONB
  • Mysql 使用
连接器默认映射
JSON@db.Json

Bytes

  • Bytes

默认类型

连接器默认映射
PostgreSQLbytea
SQL Servervarbinary
MySQLLONGBLOB
MongoDBBinData
SQLiteBLOB
CockroachDBBYTES

model 字段修饰符

[]修饰符

使字段成为列表

ts
model User {
  id             Int      @id @default(autoincrement())
  favoriteColors String[] @default(["red", "blue", "green"])
}

? 修饰符

非必填

bash
model User {
  id   Int     @id @default(autoincrement())
  name String?
}

属性

属性修改字段或者模块(models)的行为,有两种方法可以向数据模型添加属性:

  • 字段使用前缀@

  • 模块使用后缀@@

有些属性可以带参数并且参数必须有参数名,但大多数情况下,可以忽略掉参数名

注意

  1. 签名中前导下划线()表示可以省略参数名_

@id 主键

  • 不能定义在关系字段上

  • 不能是可选的

  • 对应的数据库类型: Primary Key

  • 可以使用@default()进行注解

  1. autoincrement() 自增

  2. uuid() 是基于时间戳,MAC 地址,随机数等多种因素造成的. 理论上全球范围内不可能重复

  3. cuid()

  • 仅仅关系型数据库
ts
model User {
  id   Int    @id @default(autoincrement())
  name String
}
  • cuid
ts
model User {
  id   String @id @default(cuid())
  name String
}
  • uuid
ts
model User {
  id   String @id @default(uuid())
  name String
}

@@id

多字段合并为主键

  • 对应数据库类型: PRIMARY KEY
ts
model User {
  firstName String
  lastName  String
  email     String  @unique
  isAdmin   Boolean @default(false)

  @@id([firstName, lastName])
}

联合主键 把 firstName 和 lastName 合并为主键

创建用户时,必须提供 firstNamelastName 的唯一组合:

@default

默认值可以是静态值(4,hello)或以下函数之一

  • autoincrement() 自增

  • dbgenerated() 表示无法在 Prisma 中表示的默认值

  • cuid() 基于 cuid 规范生成全局唯一标识符。

  • uuid() 是基于时间戳,MAC 地址,随机数等多种因素造成的. 理论上全球范围内不可能重复

  • now() 表示当前时间

ts
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字段

  • 一个模型可以有任意多个唯一约束

  • 可以在任何标量字段上定义

  • 不能应用在关系字段

ts
model User {
  email String @unique
  name  String
}
  • 使用
ts
model User {
  token String @unique @default(cuid())
  name  String
}

@@unique

  • 符合唯一约束
ts
model User {
  id        Int     @default(autoincrement())
  firstName String
  lastName  String
  isAdmin   Boolean @default(false)

  @@unique([firstName, lastName])
}

@@index

创建数据库索引

ts
model Post {
  id      Int     @id @default(autoincrement())
  title   String
  content String?
  @@index([title])
}
  • 创面命令索引
ts
model Post {
  id      Int     @id @default(autoincrement())
  title   String
  content String?
  @@index(fields: [title, content], name: "main_index")
}

@relation

ts
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

ts
model User {
  id        Int    @id @default(autoincrement())
  firstName String @map("first_name")
}

@@map

映射模型到数据库表的名字

模型的就是 User 数据库对应的表就是users

ts
model User {
  id   Int    @id @default(autoincrement())
  name String

  @@map("users")
}

@updateAt

自动存储记录上次更新的时间。如果您自己不提供时间,Prisma 客户端将自动为具有此属性的字段设置值。

ts
model Post {
  id        String   @id
  updatedAt DateTime @updatedAt
}

@ignore

忽略字段

ts
model Product {
  id   Int   @default(autoincrement())
  tags Tag[] @ignore
}

忽略表

ts
model Tag {
  id String? @db.VarChar

  @@ignore
}

autoincrement()

自增类型

ts
model User {
  id   Int    @id @default(autoincrement())
  name String
}

cuid()

基于 cuid 规范生成全局唯一标识符。

ts
model User {
  id   String @id @default(cuid())
  name String
}

uuid()

基于时间戳,MAC 地址,随机数等多种因素造成的. 理论上全球范围内不可能重复

ts
model User {
  id   String @id @default(uuid())
  name String
}

now()

设置创建记录的时间戳

ts
model User {
  id   String @id @default(now())
  name String
}

dbgenerated()

表示无法在 Prisma 中表示的默认值

ts
model User {
  id   String @id @default(dbgenerated())
  name String
}