Drizzle ORMスキーマにおけるデフォルト値
SQLのDEFAULT句をDrizzle ORMの.default()チェーンメソッドに変換します。静的値、SQL式、タイムスタンプ、UUID、ブーリアンデフォルトを解説します。
Best Practices
詳細な説明
Drizzleにおけるデフォルト値
SQLのDEFAULT句はDrizzleの.default()チェーンメソッドに変換されます。Drizzleは静的なTypeScript値と動的なSQL式の両方をデフォルトとしてサポートしています。
静的デフォルト
数値、文字列、ブーリアンなどの単純な値はJavaScriptリテラルを使用します:
CREATE TABLE settings (
id SERIAL PRIMARY KEY,
theme VARCHAR(20) DEFAULT 'dark',
font_size INTEGER DEFAULT 14,
notifications BOOLEAN DEFAULT TRUE,
max_retries INTEGER DEFAULT 3
);
export const settings = pgTable("settings", {
id: serial("id").primaryKey(),
theme: varchar("theme", { length: 20 }).default("dark"),
fontSize: integer("font_size").default(14),
notifications: boolean("notifications").default(true),
maxRetries: integer("max_retries").default(3),
});
SQL式デフォルト
データベース関数を含む動的デフォルトはsqlテンプレートタグを使用します:
CREATE TABLE users (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
import { pgTable, timestamp, uuid } from "drizzle-orm/pg-core";
import { sql } from "drizzle-orm";
export const users = pgTable("users", {
id: uuid("id").default(sql`gen_random_uuid()`).primaryKey(),
createdAt: timestamp("created_at").default(sql`CURRENT_TIMESTAMP`),
updatedAt: timestamp("updated_at").default(sql`CURRENT_TIMESTAMP`),
});
一般的なデフォルトマッピング
| SQLデフォルト | Drizzleデフォルト |
|---|---|
DEFAULT 0 |
.default(0) |
DEFAULT '' |
.default("") |
DEFAULT TRUE |
.default(true) |
DEFAULT FALSE |
.default(false) |
DEFAULT CURRENT_TIMESTAMP |
.default(sql\CURRENT_TIMESTAMP`)` |
DEFAULT NOW() |
.default(sql\CURRENT_TIMESTAMP`)` |
DEFAULT gen_random_uuid() |
.default(sql\gen_random_uuid()`)` |
DEFAULT uuid() |
.default(sql\(UUID())`)` |
Drizzleの.$defaultFn()
アプリケーションレベルのデフォルト(データベースレベルではない)には、Drizzleは.$defaultFn()を提供します:
import { v4 as uuidv4 } from "uuid";
export const users = pgTable("users", {
id: text("id").$defaultFn(() => uuidv4()).primaryKey(),
});
これはデータベースではなくアプリケーションコードでデフォルトを生成します。SQLコンバーターはSQLデフォルトから変換するため、データベースレベルの.default()呼び出しを生成します。
JSONデフォルト
オブジェクトデフォルトを持つJSONカラムの場合:
metadata: jsonb("metadata").notNull().default({}),
tags: json("tags").notNull().default([]),
DrizzleはJavaScriptオブジェクトをデータベースに送信する際にJSONにシリアライズします。
ユースケース
SQLスキーマがタイムスタンプ、UUID、ブーリアン、静的値を含むさまざまなDEFAULT句を使用しており、Drizzle ORMスキーマで正しく表現されることを確認する必要がある場合。