PrismaオプショナルフィールドからSQL Nullableカラムへの変換

Prismaのオプショナルフィールド(?マーク付き)がNOT NULL制約なしのnullable SQLカラムにどのように変換されるかを理解します。デフォルト値とNULL処理を解説します。

Field Types

詳細な説明

オプショナル(Nullable)フィールドの変換

Prismaでは、型に?サフィックスを付けるとフィールドがオプション(nullable)になります。これはSQLのデフォルト(NOT NULLが指定されない限りカラムはnullable)と逆です。

Prismaスキーマの例

model Employee {
  id         Int      @id @default(autoincrement())
  firstName  String   @map("first_name")
  lastName   String   @map("last_name")
  middleName String?  @map("middle_name")
  email      String   @unique
  phone      String?
  bio        String?
  hireDate   DateTime @map("hire_date")
  termDate   DateTime? @map("term_date")

  @@map("employees")
}

生成されるSQL

CREATE TABLE employees (
  id SERIAL PRIMARY KEY,
  first_name VARCHAR(255) NOT NULL,
  last_name VARCHAR(255) NOT NULL,
  middle_name VARCHAR(255),
  email VARCHAR(255) NOT NULL UNIQUE,
  phone VARCHAR(255),
  bio VARCHAR(255),
  hire_date TIMESTAMP NOT NULL,
  term_date TIMESTAMP
);

マッピングルール

Prisma SQL
String(必須) VARCHAR(255) NOT NULL
String?(オプション) VARCHAR(255)(nullable)
Int(必須) INTEGER NOT NULL
Int?(オプション) INTEGER(nullable)

この違いが重要な理由

  • Prismaのデフォルト: フィールドは必須(non-nullable)。?で明示的にnullabilityを選択する必要があります。
  • SQLのデフォルト: カラムはnullableNOT NULLを明示的に追加して必須にする必要があります。

変換ツールはこの2つの規約を正しく変換し、必須のPrismaフィールドにNOT NULLを追加し、オプションフィールドでは省略します。

デフォルト値付きオプショナルフィールド

オプション性とデフォルト値を組み合わせることができます。例えば、status String? @default("active")はデフォルト値付きのnullableカラムを生成します:status VARCHAR(255) DEFAULT 'active'。新しい行はデフォルトで"active"になりますが、カラムは明示的にNULLに設定することもできます。

ユースケース

一部の個人情報(ミドルネーム、電話番号、退職日)がレコード作成時に利用できない可能性がある従業員データベースをモデリングしており、SQLスキーマがどのカラムがNULL値を受け入れるかを正しく反映する必要があります。

試してみる — Prisma to SQL Schema

フルツールを開く