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") |
リテラル数値(0、1.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つの組み込みデフォルト関数を提供しています:
autoincrement()— SERIAL、AUTO_INCREMENT、IDENTITYにマッピングnow()— NOW()、CURRENT_TIMESTAMP、GETDATE()にマッピングuuid()— PrismaレベルでUUID v4を生成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_atとupdated_atの両方にDEFAULT NOW()が設定されることが多いです。Prismaでは:
@default(now())をcreated_atに — 作成時に一度だけ設定@updatedAtをupdated_atに — Prismaクライアントで保存するたびに自動更新
コンバーターは一般的なカラム名(updated_at、modified_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()にフォールバックします。