SQLのDEFAULT句をPrismaの@default属性にマッピングする

SQLのDEFAULT式(リテラル、NOW()、シーケンス、データベース関数)がPrismaの@default()、@default(autoincrement())、@default(now())、@default(dbgenerated())にどのようにマッピングされるかを学びます。

Advanced Features

詳細な説明

Prismaにおけるデフォルト値

SQLのDEFAULT句は、INSERT時に明示的な値が提供されない場合のカラムの初期値を設定します。Prismaはいくつかの組み込みデフォルト関数と、任意のデータベース式に対するフォールバックをサポートしています。

SQLの例

CREATE TABLE articles (
  id SERIAL PRIMARY KEY,
  uuid UUID NOT NULL DEFAULT gen_random_uuid(),
  title VARCHAR(255) NOT NULL,
  status VARCHAR(20) NOT NULL DEFAULT 'draft',
  view_count INTEGER NOT NULL DEFAULT 0,
  is_featured BOOLEAN NOT NULL DEFAULT false,
  rating DECIMAL(3, 2) NOT NULL DEFAULT 0.00,
  published_at TIMESTAMPTZ,
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
);

生成されるPrismaスキーマ

model Article {
  id          Int       @id @default(autoincrement())
  uuid        String    @default(uuid()) @db.Uuid
  title       String
  status      String    @default("draft") @db.VarChar(20)
  viewCount   Int       @default(0) @map("view_count")
  isFeatured  Boolean   @default(false) @map("is_featured")
  rating      Decimal   @default(0.00) @db.Decimal(3, 2)
  publishedAt DateTime? @map("published_at") @db.Timestamptz()
  createdAt   DateTime  @default(now()) @map("created_at") @db.Timestamptz()
  updatedAt   DateTime  @updatedAt @map("updated_at") @db.Timestamptz()

  @@map("articles")
}

デフォルトのマッピング表

SQLのデフォルト Prismaのデフォルト
リテラル文字列('draft' @default("draft")
リテラル数値(01.5 @default(0)@default(1.5)
true / false @default(true)@default(false)
NOW() / CURRENT_TIMESTAMP @default(now())
SERIAL / AUTO_INCREMENT @default(autoincrement())
gen_random_uuid() @default(uuid())
その他のDB関数 @default(dbgenerated("..."))

Prisma組み込み関数

Prismaは4つの組み込みデフォルト関数を提供しています:

  1. autoincrement() — SERIAL、AUTO_INCREMENT、IDENTITYにマッピング
  2. now() — NOW()、CURRENT_TIMESTAMP、GETDATE()にマッピング
  3. uuid() — PrismaレベルでUUID v4を生成
  4. cuid() — PrismaレベルでCUIDを生成

dbgenerated()エスケープハッチ

Prismaの組み込み関数ではカバーされないデータベース固有のデフォルトには、dbgenerated()を使用します:

// PostgreSQL配列のデフォルト
tags String[] @default(dbgenerated("'{}'::text[]"))

// PostGISジオメトリのデフォルト
location Unsupported("geometry") @default(dbgenerated("ST_GeomFromText('POINT(0 0)')"))

// MySQL UUID関数
id String @default(dbgenerated("(UUID())"))

@updatedAt vs DEFAULT NOW()

SQLではcreated_atupdated_atの両方にDEFAULT NOW()が設定されることが多いです。Prismaでは:

  • @default(now())created_atに — 作成時に一度だけ設定
  • @updatedAtupdated_atに — Prismaクライアントで保存するたびに自動更新

コンバーターは一般的なカラム名(updated_atmodified_at)を検出し、@default(now())の代わりに@updatedAtを適用します。

Enumのデフォルト

enum型のカラムにデフォルトがある場合:

status user_status NOT NULL DEFAULT 'active'

Prismaはenum値に直接マッピングします:

status UserStatus @default(active)

Prismaのenumデフォルトはクォートなしのenum値を使用することに注意してください。

ユースケース

SQLスキーマがリテラル値、タイムスタンプ用のNOW()、UUID用のgen_random_uuid()、オートインクリメント用のSERIALなど、さまざまなデフォルト式を使用している場合に、コンバーターが各式を適切なPrismaの@default関数にマッピングするか、dbgenerated()にフォールバックします。

試してみる — SQL to Prisma Schema

フルツールを開く