メインコンテンツにスキップ

データベースマッピング

Prismaスキーマには、特定のデータベースオブジェクトの名前を定義できるメカニズムが含まれています。次のことができます。

コレクション/テーブル名とフィールド/カラム名のマッピング

データベース内のエンティティを記述するために使用される名前が、生成されたAPIで望ましい名前と一致しない場合があります。Prismaスキーマで名前をマッピングすることで、基になるデータベース名を変更することなく、Client APIでの命名に影響を与えることができます。

たとえば、データベースでテーブル/コレクションに名前を付ける一般的なアプローチは、複数形とsnake_case表記を使用することです。ただし、弊社では別の命名規則(単数形、PascalCase)を推奨しています。

@map@@mapを使用すると、基になるデータベースのテーブル名とカラム名からモデル名とフィールド名を分離することで、Prisma Client APIの構造を調整できます。

コレクション/テーブル名をマッピングする

例として、commentsという名前のテーブルを持つデータベースをイントロスペクトすると、結果のPrismaモデルは次のようになります。

model comments {
// Fields
}

ただし、@@map属性を使用することで、基になるデータベースのcommentsテーブルの名前を変更することなく、モデルの名前としてCommentを選択(例:命名規則に従うため)できます。

model Comment {
// Fields

@@map("comments")
}

この変更されたモデル定義により、Prisma Clientは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 Client APIではprisma.comment.comment_textとして利用できませんが、prisma.comment.contentを介してアクセスできます。

enum名と値をマッピングする

enum値を@mapするか、enumを@@mapすることもできます。

enum Type {
Blog,
Twitter @map("comment_twitter")

@@map("comment_source_enum")
}

制約名とインデックス名

属性@id@@id@unique@@unique@@index、および@relationについて、map引数を使用してPrismaスキーマで基になる制約名とインデックス名を明示的に定義できます。(これは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}_pkeyUser_pkey
ユニーク制約{tablename}_{column_names}_keyUser_firstName_last_Name_key
非ユニークインデックス{tablename}_{column_names}_idxUser_age_idx
外部キー{tablename}_{column_names}_fkeyUser_childName_fkey

ほとんどのデータベースにはエンティティ名の長さに制限があるため、データベースの制限に違反しないように、必要に応じて名前が切り詰められます。完全な名前が許容される最大長になるように、必要に応じて_suffixの前の部分を短縮します。

デフォルトの制約名の使用

map引数によって明示的な名前が提供されない場合、Prisma ORMはデフォルトの命名規則に従ってインデックス名と制約名を生成します。

データベースをイントロスペクトすると、インデックスと制約の名前は、Prisma ORMの命名規則に従っていない限り、スキーマに追加されます。もし従っている場合、スキーマをより読みやすくするために名前はレンダリングされません。そのようなスキーマをマイグレートすると、Prismaはデフォルトの名前を推測し、それらをデータベースに永続化します。

以下のスキーマは、3つの制約(@id@unique、および@relation)と1つのインデックス(@@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引数を使用して、基になるデータベースにカスタム制約およびインデックス名を定義できます。

以下の例では、1つの@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

mapに加えて、@@id@@unique属性はオプションのname引数を受け入れ、Prisma Client 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 Client APIが代わりに次のように変更されます。

const user = await prisma.user.findUnique({
where: {
fullName: {
firstName: 'Paul',
lastName: 'Panther',
},
},
})
© . All rights reserved.