Default Values in Drizzle ORM Schema
Convert SQL DEFAULT clauses to Drizzle ORM's .default() chain method. Covers static values, SQL expressions, timestamps, UUIDs, and boolean defaults.
Detailed Explanation
Default Values in Drizzle
SQL DEFAULT clauses are converted to Drizzle's .default() chain method. Drizzle supports both static TypeScript values and dynamic SQL expressions as defaults.
Static Defaults
Simple values like numbers, strings, and booleans use JavaScript literals:
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 Expression Defaults
Dynamic defaults that involve database functions use the sql template tag:
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`),
});
Common Default Mappings
| SQL Default | Drizzle Default |
|---|---|
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's .$defaultFn()
For application-level defaults (not database-level), Drizzle provides .$defaultFn():
import { v4 as uuidv4 } from "uuid";
export const users = pgTable("users", {
id: text("id").$defaultFn(() => uuidv4()).primaryKey(),
});
This generates the default in your application code rather than in the database. The SQL converter generates database-level .default() calls since it is converting from SQL defaults.
JSON Defaults
For JSON columns with object defaults:
metadata: jsonb("metadata").notNull().default({}),
tags: json("tags").notNull().default([]),
Drizzle serializes JavaScript objects to JSON when sending them to the database.
Use Case
Your SQL schema uses various DEFAULT clauses including timestamps, UUIDs, booleans, and static values, and you need to ensure they are correctly represented in the Drizzle ORM schema.