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つの方法で命名を処理します:

  1. @map/@@mapあり: 指定された名前をそのまま使用。
  2. マッピングなし: 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カラム名とテーブル名を正しく生成するか確認する必要があります。

試してみる — Prisma to SQL Schema

フルツールを開く