数据库映射
在 Prisma 架构 中包含允许你定义某些数据库对象名称的机制。你可以
映射集合/表和字段/列名称
有时用于描述数据库中实体的名称可能与你在生成的 API 中的首选名称不匹配。在 Prisma 架构中映射名称允许你影响客户端 API 中的命名,而无需更改底层数据库名称。
例如,在数据库中为表/集合命名的一种常见方法是使用复数形式和 snake_case 表示法。但是,我们建议使用不同的 命名约定(单数形式,PascalCase)。
@map
和 @@map
允许你 调整 Prisma 客户端 API 的形状,通过将模型和字段名称与底层数据库中的表和列名称解耦。
映射集合 / 表名称
例如,当你 内省 一个名为 comments
的表的数据库时,生成的 Prisma 模型将如下所示
model comments {
// Fields
}
但是,你仍然可以选择 Comment
作为模型的名称(例如,遵循命名约定),而无需使用 @@map
属性重命名数据库中的底层 comments
表
model Comment {
// Fields
@@map("comments")
}
使用此修改后的模型定义,Prisma 客户端会自动将 Comment
模型映射到底层数据库中的 comments
表。
映射字段 / 列名称
你也可以 @map
一列/字段名称
model Comment {
content String @map("comment_text")
email String @map("commenter_email")
type Enum @map("comment_type")
@@map("comments")
}
这样,comment_text
列在 Prisma 客户端 API 中不可用 prisma.comment.comment_text
下,但可以通过 prisma.comment.content
访问。
映射枚举名称和值
你也可以 @map
一个枚举值,或者 @@map
一个枚举
enum Type {
Blog,
Twitter @map("comment_twitter")
@@map("comment_source_enum")
}
约束和索引名称
你可以选择使用 map
参数在 Prisma 架构中为属性 @id
、@@id
、@unique
、@@unique
、@@index
和 @relation
明确定义底层约束和索引名称。(这在 Prisma ORM 版本 2.29.0 及更高版本中可用。)
当内省数据库时,map
参数仅在名称不同于 Prisma ORM 的 索引和约束的默认约束命名约定 时才会在架构中呈现。
如果你在 2.29.0 之前的版本中使用 Prisma Migrate,并且希望在升级到更新版本后保留现有的约束和索引名称,不要立即运行 prisma migrate
或 prisma db push
。这将更改任何不遵循 Prisma ORM 约定的底层约束名称。请按照 允许你保留现有约束和索引名称的升级路径 进行操作。
命名约束的用例
明确命名约束的一些用例包括
- 公司政策
- 其他工具的约定
Prisma ORM 的索引和约束的默认命名约定
Prisma ORM 的命名约定是为了与 PostgreSQL 保持一致而选择的,因为它是确定性的。它还有助于最大限度地增加不需要呈现名称的次数,因为许多现有数据库已经与该约定保持一致。
Prisma ORM 在生成默认索引和约束名称时始终使用实体的数据库名称。如果模型通过 @@map
或 @map
重新映射到数据模型中的不同名称,默认名称生成仍将以数据库中的表的名称作为输入。字段和列也是如此。
实体 | 约定 | 示例 |
---|---|---|
主键 | {tablename}_pkey | User_pkey |
唯一约束 | {tablename}_{column_names}_key | User_firstName_last_Name_key |
非唯一索引 | {tablename}_{column_names}_idx | User_age_idx |
外键 | {tablename}_{column_names}_fkey | User_childName_fkey |
由于大多数数据库对实体名称有长度限制,因此在必要时将缩短名称,以避免违反数据库限制。我们将尽可能缩短 _suffix
之前的部分,以便完整名称最多为允许的最大长度。
使用默认约束名称
当没有通过 map
参数提供明确名称时,Prisma ORM 将遵循 默认命名约定 生成索引和约束名称。
如果你内省数据库,索引和约束的名称将添加到你的架构中,除非它们遵循 Prisma ORM 的命名约定。如果它们遵循,则不会呈现名称以使架构更易读。当你迁移这样的架构时,Prisma 将推断默认名称并将它们持久化到数据库中。
示例
以下架构定义了三个约束(@id
、@unique
和 @relation
)和一个索引(@@index
)
model User {
id Int @id @default(autoincrement())
name String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name])
@@index([title, authorName])
}
由于没有通过 map
参数提供明确名称,因此 Prisma 将假设它们遵循我们的默认命名约定。
下表列出了底层数据库中每个约束和索引的名称
约束或索引 | 遵循约定 | 底层约束或索引名称 |
---|---|---|
@id (在 User > id 字段上) | 是 | User_pk |
@@index (在 Post 上) | 是 | Post_title_authorName_idx |
@id (在 Post > id 字段上) | 是 | Post_pk |
@relation (在 Post > author 上) | 是 | Post_authorName_fkey |
使用自定义约束 / 索引名称
你可以使用 map
参数在底层数据库中定义自定义约束和索引名称。
示例
以下示例为一个 @id
和 @@index
添加自定义名称
model User {
id Int @id(map: "Custom_Primary_Key_Constraint_Name") @default(autoincrement())
name String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
authorName String @default("Anonymous")
author User? @relation(fields: [authorName], references: [name])
@@index([title, authorName], map: "My_Custom_Index_Name")
}
下表列出了底层数据库中每个约束和索引的名称
约束或索引 | 遵循约定 | 底层约束或索引名称 |
---|---|---|
@id (在 User > id 字段上) | 否 | Custom_Primary_Key_Constraint_Name |
@@index (在 Post 上) | 否 | My_Custom_Index_Name |
@id (在 Post > id 字段上) | 是 | Post_pk |
@relation (在 Post > author 上) | 是 | Post_authorName_fkey |
相关:为 Prisma 客户端命名索引和主键
除了 map
之外,@@id
和 @@unique
属性还接受一个可选的 name
参数,允许你自定义 Prisma 客户端 API。
在像这样的模型上
model User {
firstName String
lastName String
@@id([firstName, lastName])
}
使用该主键进行选择的默认 API 使用字段的组合生成的
const user = await prisma.user.findUnique({
where: {
firstName_lastName: {
firstName: 'Paul',
lastName: 'Panther',
},
},
})
指定 @@id([firstName, lastName], name: "fullName")
将改为将 Prisma 客户端 API 更改为此
const user = await prisma.user.findUnique({
where: {
fullName: {
firstName: 'Paul',
lastName: 'Panther',
},
},
})