drizzle-team/drizzle-orm · error · DrizzleError

No fields selected for table "${tableConfig.tsName}" ("${tab

Error message

No fields selected for table "${tableConfig.tsName}" ("${tableAlias}")

What it means

Thrown as a DrizzleError in buildRelationalQuery (dialect.ts:834) when the relational (db.query.*) builder ends up with zero selected fields for a table after applying the columns include/exclude rules. Because the relational API aggregates results into JSON, an empty selection would produce meaningless output, so Drizzle aborts naming the table's TS name and alias.

Source

Thrown at drizzle-orm/src/singlestore-core/dialect.ts:834

					on: sql`true`,
					table: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),
					alias: relationTableAlias,
					joinType: 'left',
					lateral: true,
				});
				selection.push({
					dbKey: selectedRelationTsKey,
					tsKey: selectedRelationTsKey,
					field,
					relationTableTsKey: relationTableTsName,
					isJson: true,
					selection: builtRelation.selection,
				});
			}
		}

		if (selection.length === 0) {
			throw new DrizzleError({
				message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}")`,
			});
		}

		let result;

		where = and(joinOn, where);

		if (nestedQueryRelation) {
			let field = sql`JSON_TO_ARRAY(${
				sql.join(
					selection.map(({ field, tsKey, isJson }) =>
						isJson
							? sql`${sql.identifier(`${tableAlias}_${tsKey}`)}.${sql.identifier('data')}`
							: is(field, SQL.Aliased)
							? field.sql
							: field
					),

View on GitHub (pinned to b7862528fd)

Solutions

  1. Ensure at least one column is selected: leave columns undefined (selects all) or set at least one column to true in include mode.
  2. If you only need relations, keep an id or minimal column set selected rather than excluding everything.
  3. Audit the columns config generator to guarantee a non-empty selection.

Example fix

// before
await db.query.users.findMany({ columns: { id: false, name: false, email: false } });
// after
await db.query.users.findMany({ columns: { id: true } });
Defensive patterns

Strategy: validation

Validate before calling

function hasSelectedColumn(columnsConfig) {
  if (!columnsConfig) return true; // undefined selects all
  const entries = Object.entries(columnsConfig);
  const anyTrue = entries.some(([, v]) => v === true);
  if (anyTrue) return entries.some(([, v]) => v === true);
  // exclude mode: ensure at least one column remains
  return entries.length < Object.keys(allColumns).length;
}

Type guard

function querySelectsAtLeastOneColumn(config, tableColumns) {
  if (!config.columns) return true;
  const keys = Object.keys(config.columns).filter((k) => config.columns[k] !== undefined);
  const include = keys.some((k) => config.columns[k] === true);
  return include ? keys.some((k) => config.columns[k] === true) : keys.length < Object.keys(tableColumns).length;
}

Prevention

When it happens

Trigger: Using the RQB-style API db.query.table.findMany({ columns: { ... } }) where every column is explicitly set to false (exclude mode) and no `with`/`extras` are requested; passing an empty columns object alongside no relations; schema misconfiguration where tableConfig.columns resolves to an empty object.

Common situations: Building a query that only wants related rows (with: {...}) but forgets to leave at least one column or use `columns: {}` semantics incorrectly; dynamically excluding all columns based on a runtime allowlist; schema where all columns were marked excluded by a generator.

Related errors


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