{"id":"e4ea7b1253581574","repo":"drizzle-team/drizzle-orm","slug":"cannot-execute-a-query-on-a-query-builder-please-e4ea7b","errorCode":null,"errorMessage":"Cannot execute a query on a query builder. Please use a database instance instead.","messagePattern":"Cannot execute a query on a query builder\\. Please use a database instance instead\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"drizzle-orm/src/mysql-core/query-builders/select.ts","lineNumber":1130,"sourceCode":"\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends MySqlSelectQueryBuilderBase<\n\tMySqlSelectHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTPreparedQueryHKT,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> {\n\tstatic override readonly [entityKind]: string = 'MySqlSelect';\n\n\tprepare(): MySqlSelectPrepare<this> {\n\t\tif (!this.session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\t\tconst fieldsList = orderSelectedFields<MySqlColumn>(this.config.fields);\n\t\tconst query = this.session.prepareQuery<\n\t\t\tMySqlPreparedQueryConfig & { execute: SelectResult<TSelection, TSelectMode, TNullabilityMap>[] },\n\t\t\tTPreparedQueryHKT\n\t\t>(this.dialect.sqlToQuery(this.getSQL()), fieldsList, undefined, undefined, undefined, {\n\t\t\ttype: 'select',\n\t\t\ttables: [...this.usedTables],\n\t\t}, this.cacheConfig);\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query as MySqlSelectPrepare<this>;\n\t}\n\n\texecute = ((placeholderValues) => {\n\t\treturn this.prepare().execute(placeholderValues);\n\t}) as ReturnType<this['prepare']>['execute'];\n\n\tprivate createIterator = (): ReturnType<this['prepare']>['iterator'] => {","sourceCodeStart":1112,"sourceCodeEnd":1148,"githubUrl":"https://github.com/drizzle-team/drizzle-orm/blob/b7862528fd8fc39bc2653a6c18dad7c1f4e68d10/drizzle-orm/src/mysql-core/query-builders/select.ts#L1112-L1148","documentation":"Thrown by MySqlSelectBase.prepare (line 1130) when this.session is undefined. Select builders created from a QueryBuilder instance (new QueryBuilder() or the $db builder) have no session and therefore cannot execute. Only a db instance (which carries a session) can run queries.","triggerScenarios":"Constructing a select via a QueryBuilder (not a db) and then calling .execute(), .prepare(), .all(), or iterating. The QueryBuilder is meant for composing SQL to be run elsewhere, not for direct execution.","commonSituations":"Using `import { QueryBuilder } from 'drizzle-orm/mysql-core'; const qb = new QueryBuilder(); qb.select().from(t).execute();` - qb has no session. Confusing QueryBuilder with the db instance.","solutions":["Execute selects from a db instance: const db = drizzle(...); db.select().from(t).execute();","If you built a query with QueryBuilder for reuse, pass it to a db via db.$withRecursive or run its SQL with db.execute(sql`...`).","Make sure you're not accidentally destructuring select off a QueryBuilder instead of db."],"exampleFix":"// before - QueryBuilder has no session\nimport { QueryBuilder } from 'drizzle-orm/mysql-core';\nconst qb = new QueryBuilder();\nawait qb.select().from(users).execute(); // throws\n\n// after - use a db instance\nimport { drizzle } from 'drizzle-orm/mysql2';\nconst db = drizzle(client);\nawait db.select().from(users).execute();","handlingStrategy":"type-guard","validationCode":"// Ensure you execute from a db, not a QueryBuilder\nif (!('session' in dbOrBuilder) || !(dbOrBuilder as any).session) {\n  throw new Error('Use a drizzle() db instance to execute queries');\n}","typeGuard":"import { MySqlDatabase } from '~/mysql-core/db.ts';\nfunction isExecutableDb(v: unknown): v is MySqlDatabase<any, any, any, any> {\n  return v instanceof MySqlDatabase;\n}","tryCatchPattern":null,"preventionTips":["Always execute from a drizzle() db instance.","Don't confuse QueryBuilder with db; QueryBuilder composes SQL only.","If composing with QueryBuilder, run the resulting SQL via db.execute(sql`...`)."],"tags":["mysql","select","query-builder","session","execution"],"analyzedSha":"b7862528fd8fc39bc2653a6c18dad7c1f4e68d10","analyzedAt":"2026-08-03T18:11:14.318Z","schemaVersion":2}