Primsa Schema 中必须掌握的13 种属性

一、简介

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 的库。

相关推荐
放逐者-保持本心,方可放逐1 分钟前
SSE 流式场景应用 及 方案总结
javascript·axios·fetch·eventsource
还是大剑师兰特2 分钟前
面试题:ES6模块与CommonJS模块有什么异同?
前端·es6·大剑师
胡西风_foxww17 分钟前
【ES6复习笔记】数值扩展(16)
前端·笔记·es6·扩展·数值
mosen86819 分钟前
uniapp中uni.scss如何引入页面内或生效
前端·uni-app·scss
白云~️19 分钟前
uniappX 移动端单行/多行文字隐藏显示省略号
开发语言·前端·javascript
沙尘暴炒饭21 分钟前
uniapp 前端解决精度丢失的问题 (后端返回分布式id)
前端·uni-app
昙鱼36 分钟前
springboot创建web项目
java·前端·spring boot·后端·spring·maven
天天进步201541 分钟前
Vue项目重构实践:如何构建可维护的企业级应用
前端·vue.js·重构
小华同学ai44 分钟前
vue-office:Star 4.2k,款支持多种Office文件预览的Vue组件库,一站式Office文件预览方案,真心不错
前端·javascript·vue.js·开源·github·office
APP 肖提莫1 小时前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法