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

相关推荐
喵叔哟18 分钟前
重构代码之取消临时字段
java·前端·重构
还是大剑师兰特1 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解1 小时前
【深度解析】CSS工程化全攻略(1)
前端·css
一只小白菜~1 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf
方才coding1 小时前
1小时构建Vue3知识体系之vue的生命周期函数
前端·javascript·vue.js
阿征学IT1 小时前
vue过滤器初步使用
前端·javascript·vue.js
王哲晓1 小时前
第四十五章 Vue之Vuex模块化创建(module)
前端·javascript·vue.js
丶21361 小时前
【WEB】深入理解 CORS(跨域资源共享):原理、配置与常见问题
前端·架构·web
发现你走远了1 小时前
『VUE』25. 组件事件与v-model(详细图文注释)
前端·javascript·vue.js
Mr.咕咕1 小时前
Django 搭建数据管理web——商品管理
前端·python·django