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スキーマで正しく表現されることを確認する必要がある場合。

試してみる — SQL to Drizzle Schema

フルツールを開く