Prisma @mapと@@mapからSQLテーブル名とカラム名への変換
Prisma @mapと@@mapアノテーションが生成されるSQLテーブル名とカラム名をどのように制御するかを学びます。PrismaとSQLの命名規則の違いを理解します。
Advanced
詳細な説明
@mapと@@mapによる名前マッピング
PrismaはモデルにはPascalCase、フィールドにはcamelCaseを使用しますが、SQLは従来snake_caseを使用します。@mapと@@mapアノテーションは正確なデータベース名を指定することでこのギャップを埋めます。
Prismaスキーマの例
model UserProfile {
id Int @id @default(autoincrement())
firstName String @map("first_name")
lastName String @map("last_name")
dateOfBirth DateTime @map("date_of_birth")
avatarUrl String? @map("avatar_url")
isVerified Boolean @default(false) @map("is_verified")
@@map("user_profiles")
}
生成されるSQL
CREATE TABLE user_profiles (
id SERIAL PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
date_of_birth TIMESTAMP NOT NULL,
avatar_url VARCHAR(255),
is_verified BOOLEAN NOT NULL DEFAULT FALSE
);
自動変換と明示的な命名
変換ツールは2つの方法で命名を処理します:
@map/@@mapあり: 指定された名前をそのまま使用。- マッピングなし: PascalCase/camelCaseを自動的にsnake_caseに変換。
| Prisma名 | @mapなし | @map("custom_name")あり |
|---|---|---|
UserProfile(モデル) |
user_profile |
@@mapで指定した名前 |
firstName(フィールド) |
first_name |
@mapで指定した名前 |
dateOfBirth(フィールド) |
date_of_birth |
@mapで指定した名前 |
@mapの使い時
- レガシーデータベース: 非標準の命名を持つ既存データベースにPrismaを接続する場合。
- 規約: SQLの命名規則が自動snake_case変換と異なる場合。
- 予約語: 自然なフィールド名がSQL予約語と競合する場合、
@mapで異なるデータベース名を使用できます。
組み合わせの例
model OrderItem {
id Int @id @default(autoincrement())
orderId Int @map("order_id")
productId Int @map("product_id")
qty Int @map("quantity")
unitPrice Decimal @map("unit_price")
@@map("order_items")
}
ここではqtyがデータベースでquantityにマッピングされ、@mapがsnake_case等価だけでなく任意の名前にリマップできることを示しています。
ユースケース
標準的なsnake_caseに従わない確立された命名規則を持つレガシーデータベースにPrismaを接続しており、@mapアノテーションが期待されるSQLカラム名とテーブル名を正しく生成するか確認する必要があります。