drizzle-team/drizzle-orm · error · Error
we don't support params for `sql` default values
Error message
we don't support params for `sql` default values
What it means
`sqlToStr` renders an `SQL` column default back to a plain SQL string for schema serialization. drizzle-kit refuses to render any identifier token (`escapeName`) inside a `sql` default, because the static serializer has no naming context to resolve it. This fires from any serializer (pg/mysql/sqlite/singlestore/gel) when a `default(sql`...`)` expression contains a quoted name placeholder.
Source
Thrown at drizzle-kit/src/serializer/utils.ts:20
import { CasingCache, toCamelCase, toSnakeCase } from 'drizzle-orm/casing';
import { CasingType } from '../cli/validations/common';
export function getColumnCasing(
column: { keyAsName: boolean; name: string | undefined },
casing: CasingType | undefined,
) {
if (!column.name) return '';
return !column.keyAsName || casing === undefined
? column.name
: casing === 'camelCase'
? toCamelCase(column.name)
: toSnakeCase(column.name);
}
export const sqlToStr = (sql: SQL, casing: CasingType | undefined) => {
return sql.toQuery({
escapeName: () => {
throw new Error("we don't support params for `sql` default values");
},
escapeParam: () => {
throw new Error("we don't support params for `sql` default values");
},
escapeString: () => {
throw new Error("we don't support params for `sql` default values");
},
casing: new CasingCache(casing),
}).sql;
};
export const sqlToStrGenerated = (sql: SQL, casing: CasingType | undefined) => {
return sql.toQuery({
escapeName: () => {
throw new Error("we don't support params for `sql` default values");
},
escapeParam: () => {
throw new Error("we don't support params for `sql` default values");View on GitHub (pinned to b7862528fd)
Solutions
- Rewrite the `sql` default to a constant expression with no identifier/param/string placeholders, e.g. `default(sql`now()`)`.
- If a dynamic name is required, use a plain string default or a `defaultFn` instead of `default(sql`...`)`.
- Avoid embedding `sql.identifier(...)` inside column defaults.
Example fix
// before
created: timestamp('created', { mode: 'date' }).default(sql`${sql.identifier('now')}()`),
// after
created: timestamp('created', { mode: 'date' }).default(sql`now()`), Defensive patterns
Strategy: validation
Validate before calling
// Refuse sql defaults that contain identifier nodes before generate
import { SQL } from 'drizzle-orm';
function assertPureSqlDefault(expr: SQL) {
let hit = false;
expr.toQuery({
escapeName: () => { hit = true; return ''; },
escapeParam: () => { hit = true; return ''; },
escapeString: () => { hit = true; return ''; },
casing: { toSnake: (s) => s, toCamel: (s) => s, column: '' } as any,
});
if (hit) throw new Error('sql default contains unsupported token');
} Type guard
import { SQL } from 'drizzle-orm';
function isPureSqlDefault(expr: SQL): boolean {
let bad = false;
try {
expr.toQuery({
escapeName: () => { bad = true; return ''; },
escapeParam: () => { bad = true; return ''; },
escapeString: () => { bad = true; return ''; },
casing: { toSnake: (s) => s, toCamel: (s) => s, column: '' } as any,
});
} catch { return false; }
return !bad;
} Try / catch
try {
await import('drizzle-kit').then((k) => k.generate(config));
} catch (e) {
if ((e as Error).message.includes("params for `sql` default values")) {
// strip sql.identifier/param/string from the offending default
}
throw e;
} Prevention
- Keep sql defaults free of identifiers/params/strings; use plain SQL text.
- Prefer defaultFn for dynamic defaults.
When it happens
Trigger: Defining a column with `default(sql`<some identifier>`)` where the expression triggers the `escapeName` callback of `SQL.toQuery`, e.g. embedding a column/table name via `sql.identifier` inside a default.
Common situations: Writing `default(sql`now()`)` works (no params), but `default(sql`gen_random_uuid()`)` with a column reference, or composing defaults with `sql.identifier(...)`, triggers it. Most commonly hit by users trying to reference another column in a default expression.
Related errors
- unsupported relation type
- Invalid relation "${relation.fieldName}" for table "${it.sch
- Transaction not supported
- ${it.code}: ${it.message}
- unsupported dialect
AI-assisted analysis of drizzle-team/drizzle-orm@b7862528fd (2026-08-03).
Data as JSON: /data/errors/f1f8f26415873703.json.
Report an issue: GitHub.