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

  1. Rewrite the `sql` default to a constant expression with no identifier/param/string placeholders, e.g. `default(sql`now()`)`.
  2. If a dynamic name is required, use a plain string default or a `defaultFn` instead of `default(sql`...`)`.
  3. 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

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


AI-assisted analysis of drizzle-team/drizzle-orm@b7862528fd (2026-08-03). Data as JSON: /data/errors/f1f8f26415873703.json. Report an issue: GitHub.