likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 18

一、简介

Primsa schema 中的属性对初学者来说可能开始是一个问题,本文为了解决这个问题将 Prisma 中常用的 Schema 属性,属性函数等内容单独提取出来,更加适合读者入门。

修饰字段行为,属性分为两种:

  • 字段, 字段用 @ 表示
  • 块,用 @@ 表示

二、表格整理属性

  • 7 种 @ 属性
  • 6 种 @@ 块属性

三、属性

3.1) 属性 @id/@default

@id: 用于标识模型中的主键字段。

@default: 用于指定字段的默认值

model User {
  id   Int     @id @default(autoincrement())
}
// mongodb
model User {
  id   Int      @id @default(auto()) // MongoDB 使用 "_id" 字段作为主键
}
  • @id 是 id 属性表示
  • @default 修饰自定默认
  • autoincrement 函数属性, 表示 id 是自增的。
  • mongodb 中使用 auto 函数属性进行自增长。

3.2) 属性 @unique

@unique 是 Prisma 模型定义中的一个属性,用于确保数据库表中的特定字段值在列中是唯一的。

model User {
  email String? @unique
}

email 唯一性是典型的使用场景。将 email 字段的属性设置为唯一值的时候,每次创建时会自定的判断 email 是否已经存在。

3.3) 属性 @relation

@relation 是 Prisma 模型定义中的一个重要属性,用于定义模型之间的关系。

  • 一对一关系
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)
}
  • 一对多关系
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 模型的字段映射到数据库中的不同名称或表。

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

用于字段映射,在 JS 开发中通常使用 小驼峰 编程规范,但是在服务端数据库中通常使用 下划线 格式的数据。此时特别有用, 在 mongodb 数据库的 id 中与 _id 进行映射十分有用:

model Post {
  id       String    @id @default(auto()) @map("_id") @db.ObjectId
}

由此可见 prisma 对于业务考虑的是真的很周到。

3.5) 属性 @updatedAt

updatedAt 是一个常见的字段属性,通常用于跟踪记录的最后修改时间。

数据中数据的更新时间操作也是非常频繁的, 通常与 createdAt 一起使用:

model User {
  id       Int      @id @default(autoincrement())
  username String
  email    String   @unique
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

3.6) 属性 @ignore

@ignore 是一个自定义的属性,通常用于排除模型中的特定字段或关系,使其不会被生成到数据库表中。

model User {
  id       Int      @id @default(autoincrement())
  password String   @ignore // 使用 @ignore 排除 password 字段
}

四、块属性

4.1) 块属性 @@unique

@@unique 是用于创建唯一性约束(Unique Constraint)的属性

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 模型定义中用于创建数据库索引的属性。

model Post {
  id       Int      @id @default(autoincrement())
  title    String
  content  String
  createdAt DateTime

  @@index([title]) // 创建一个索引,加速 title 字段的搜索
}

@@index([title]) 表示创建一个数据库索引,该索引加速了 title 字段的搜索操作。

4.3) 块属性 @@map

@@map 是 Prisma 模型定义中的一个属性,用于指定模型在数据库中的表名

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 模型定义中的属性,用于排除整个模型(表)及其相关字段不会在数据库中生成。

model User {
  id       Int       @id @default(autoincrement())
  username String
  email    String    @unique
  // 其他字段

  @@ignore
}

User 模型被标记为 @@ignore,这意味着不会在数据库中生成与该模型相关的表。

4.5) 块属性 @@schema

@@schema 指定当前模型的名字

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

  @@schema("auth")
}

五、函数属性

5.1) 属性函数 auto()

表示由数据库自动生成的默认值。(仅仅适用于数据库)

model User {
    id String @map("_id") @db.ObjectId @default(auto())
}

5.2) 属性函数 autoincrement()

在底层数据库中创建一个整数序列,并根据序列将递增的值分配给创建的记录的 ID 值。

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

5.3) 属性函数 sequence()

生成自动递增整数作为 ID, 仅仅支持 CockroachDB

model User {
  id      Int     @id @sequence()
  name    String
  // 其他字段
}

5.4) 属性函数 cuid()

针对水平缩放和二分搜索查找性能进行了优化的防冲突 ID。

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

5.5) 属性函数 uuid()

生成通用唯一标识符 Universally unique identifier

model User {
  id   String @id @default(cuid()) @map("_id")
  name String
}

5.6) 属性函数 now()

设置创建记录时的时间戳。

model User {
  id       Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
}

5.7) 属性函数 dbgenerated()

表示无法在 Prisma 模式中表达的默认值

circle     Unsupported("circle")?   @default(dbgenerated("'<(10,4),11>'::circle"))

小结

本文主要目的在于讲解并熟练使用 Prisma Schema 中的字段属性,尤其适合不理解 Prisma 的前端开发者想要通过 Primsa 进入数据操作 ORM 的库。