一、简介
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 的库。