一、简介
Primsa schema 中的属性对初学者来说可能开始是一个问题,本文为了解决这个问题将 Prisma 中常用的 Schema 属性,属性函数等内容单独提取出来,更加适合读者入门。
修饰字段行为,属性分为两种:
- 字段, 字段用
@
表示 - 块,用
@@
表示
二、表格整理属性
- 7 种
@
属性 - 6 种
@@
块属性
三、属性
3.1) 属性 @id/@default
@id
: 用于标识模型中的主键字段。
@default
: 用于指定字段的默认值
ts
model User {
id Int @id @default(autoincrement())
}
ts
// mongodb
model User {
id Int @id @default(auto()) // MongoDB 使用 "_id" 字段作为主键
}
- @id 是 id 属性表示
- @default 修饰自定默认
- autoincrement 函数属性, 表示 id 是自增的。
- mongodb 中使用
auto
函数属性进行自增长。
3.2) 属性 @unique
@unique
是 Prisma 模型定义中的一个属性,用于确保数据库表中的特定字段值在列中是唯一的。
ts
model User {
email String? @unique
}
email 唯一性是典型的使用场景。将 email 字段的属性设置为唯一值的时候,每次创建时会自定的判断 email 是否已经存在。
3.3) 属性 @relation
@relation
是 Prisma 模型定义中的一个重要属性,用于定义模型之间的关系。
- 一对一关系
ts
model User {
id Int @id @default(autoincrement())
role Role @default(USER)
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
author User @relation(fields: [authorId], references: [id])
authorId Int // relation scalar field (used in the `@relation` attribute above)
}
- 一对多关系
ts
model User {
id Int @id @default(autoincrement())
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
author User @relation(fields: [authorId], references: [id])
authorId Int
}
@relation 表示字段直接关系, 第一个参数表示关系名称,可以不传,第二字段是 fields
表示关联外键,reference 表示当前字段的关系。
3.4) 属性 @map
@map
是 Prisma 模型定义中的一个自定义属性,用于将 Prisma 模型的字段映射到数据库中的不同名称或表。
ts
model User {
id Int @id @default(autoincrement())
firstName String @map("first_name")
}
用于字段映射,在 JS 开发中通常使用 小驼峰
编程规范,但是在服务端数据库中通常使用 下划线
格式的数据。此时特别有用, 在 mongodb 数据库的 id 中与 _id
进行映射十分有用:
ts
model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
}
由此可见 prisma 对于业务考虑的是真的很周到。
3.5) 属性 @updatedAt
updatedAt
是一个常见的字段属性,通常用于跟踪记录的最后修改时间。
数据中数据的更新时间操作也是非常频繁的, 通常与 createdAt 一起使用:
ts
model User {
id Int @id @default(autoincrement())
username String
email String @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
3.6) 属性 @ignore
@ignore
是一个自定义的属性,通常用于排除模型中的特定字段或关系,使其不会被生成到数据库表中。
ts
model User {
id Int @id @default(autoincrement())
password String @ignore // 使用 @ignore 排除 password 字段
}
四、块属性
4.1) 块属性 @@unique
@@unique
是用于创建唯一性约束(Unique Constraint)的属性
ts
model User {
id Int @id @default(autoincrement())
email String @unique
username String
// 其他字段
}
@@unique([email, username])
User
模型中的 email
字段被标记为 @unique
,这意味着数据库将确保在 User
表中的每行中,email
字段的值都是唯一的
4.2) 块属性 @@index
@@index
是 Prisma 模型定义中用于创建数据库索引的属性。
ts
model Post {
id Int @id @default(autoincrement())
title String
content String
createdAt DateTime
@@index([title]) // 创建一个索引,加速 title 字段的搜索
}
@@index([title])
表示创建一个数据库索引,该索引加速了 title
字段的搜索操作。
4.3) 块属性 @@map
@@map
是 Prisma 模型定义中的一个属性,用于指定模型在数据库中的表名
ts
model User {
id Int @id @default(autoincrement())
username String
email String @unique
// 其他字段
@@map(name: "custom_users_table") // 自定义表名
}
User
模型使用 @@map(name: "custom_users_table")
将表名指定为 "custom_users_table",而不是默认的 "User"。
4.4) 块属性 @@ignore
@@ignore
是 Prisma 模型定义中的属性,用于排除整个模型(表)及其相关字段不会在数据库中生成。
ts
model User {
id Int @id @default(autoincrement())
username String
email String @unique
// 其他字段
@@ignore
}
User
模型被标记为 @@ignore
,这意味着不会在数据库中生成与该模型相关的表。
4.5) 块属性 @@schema
@@schema
指定当前模型的名字
ts
model User {
id Int @id @default(autoincrement())
name String
@@schema("auth")
}
五、函数属性
5.1) 属性函数 auto()
表示由数据库自动生成的默认值。(仅仅适用于数据库)
ts
model User {
id String @map("_id") @db.ObjectId @default(auto())
}
5.2) 属性函数 autoincrement()
在底层数据库中创建一个整数序列,并根据序列将递增的值分配给创建的记录的 ID 值。
ts
model User {
id Int @id @default(autoincrement())
name String
}
5.3) 属性函数 sequence()
生成自动递增整数作为 ID, 仅仅支持 CockroachDB
ts
model User {
id Int @id @sequence()
name String
// 其他字段
}
5.4) 属性函数 cuid()
针对水平缩放和二分搜索查找性能进行了优化的防冲突 ID。
ts
model User {
id String @id @default(cuid())
name String
}
5.5) 属性函数 uuid()
生成通用唯一标识符 Universally unique identifier
ts
model User {
id String @id @default(cuid()) @map("_id")
name String
}
5.6) 属性函数 now()
设置创建记录时的时间戳。
ts
model User {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
}
5.7) 属性函数 dbgenerated()
表示无法在 Prisma 模式中表达的默认值
ts
circle Unsupported("circle")? @default(dbgenerated("'<(10,4),11>'::circle"))
小结
本文主要目的在于讲解并熟练使用 Prisma
Schema 中的字段属性,尤其适合不理解 Prisma 的前端开发者想要通过 Primsa 进入数据操作 ORM 的库。