{"id":"13ec1eeee642a094","repo":"drizzle-team/drizzle-orm","slug":"transaction-not-supported","errorCode":null,"errorMessage":"Transaction not supported","messagePattern":"Transaction not supported","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"drizzle-kit/src/cli/connections.ts","lineNumber":113,"sourceCode":"\t\t\t\t>(\n\t\t\t\t\t{\n\t\t\t\t\t\tsql: params.sql,\n\t\t\t\t\t\tparams: params.params ?? [],\n\t\t\t\t\t\ttypings: params.typings,\n\t\t\t\t\t},\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tparams.mode === 'array',\n\t\t\t\t);\n\t\t\t\tif (params.mode === 'array') {\n\t\t\t\t\tconst result = await prepared.values();\n\t\t\t\t\treturn result.rows;\n\t\t\t\t}\n\t\t\t\tconst result = await prepared.execute();\n\t\t\t\treturn result.rows;\n\t\t\t};\n\t\t\tconst transactionProxy: TransactionProxy = async (queries) => {\n\t\t\t\tthrow new Error('Transaction not supported');\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tpackageName: '@aws-sdk/client-rds-data',\n\t\t\t\tquery,\n\t\t\t\tproxy,\n\t\t\t\ttransactionProxy,\n\t\t\t\tmigrate: migrateFn,\n\t\t\t};\n\t\t}\n\n\t\tif (driver === 'pglite') {\n\t\t\tassertPackages('@electric-sql/pglite');\n\t\t\tconst { PGlite, types } = await import('@electric-sql/pglite');\n\t\t\tconst { drizzle } = await import('drizzle-orm/pglite');\n\t\t\tconst { migrate } = await import('drizzle-orm/pglite/migrator');\n\n\t\t\tconst pglite = 'client' in credentials ? credentials.client : new PGlite(normalisePGliteUrl(credentials.url));","sourceCodeStart":95,"sourceCodeEnd":131,"githubUrl":"https://github.com/drizzle-team/drizzle-orm/blob/b7862528fd8fc39bc2653a6c18dad7c1f4e68d10/drizzle-kit/src/cli/connections.ts#L95-L131","documentation":"Thrown by drizzle-kit Studio's AWS RDS Data API driver when the UI issues a transactional batch of queries. The `transactionProxy` at connections.ts:112-114 is a hard-coded stub that always rejects, because the AWS Data API models transactions as explicit Begin/Commit/Rollback workflow IDs rather than an implicit batch. drizzle-kit therefore cannot honor a generic transaction callback for this driver.","triggerScenarios":"Opening drizzle-kit Studio against an `aws-data-api` Postgres driver and performing any operation that the Studio UI sends as `type: 'tproxy'` (multi-statement transaction), e.g. running several queries inside a single Studio transaction or applying a migration through Studio's transactional path.","commonSituations":"Configuring `drizzle.config.ts` with `driver: 'aws-data-api'` and then launching `drizzle-kit studio`. The Studio frontend attempts transactional query batches for some multi-row edits/migrations, which the AWS Data API cannot service through the proxy callback shape drizzle-kit expects.","solutions":["Use a direct Postgres connection (`driver: 'pg'` or a `pg`/`postgres-js` URL) for Studio instead of `aws-data-api`, since Studio needs transactional writes.","Avoid operations in Studio that batch multiple statements in one transaction; run them individually.","Use `drizzle-kit migrate` from the CLI (not Studio) against the AWS Data API, where drizzle-orm's own transaction handling applies."],"exampleFix":"// before (drizzle.config.ts)\nexport default defineConfig({ dialect: 'postgresql', driver: 'aws-data-api', /* ... */ });\n// after - use a direct connection for Studio\nexport default defineConfig({ dialect: 'postgresql', dbCredentials: { url: process.env.PG_URL! } });","handlingStrategy":"validation","validationCode":"// Before launching Studio for aws-data-api, gate transactional use:\nimport type { DrizzleConfig } from 'drizzle-orm';\nconst isAwsDataApi = (c: any) => c.driver === 'aws-data-api';\nif (isAwsDataApi(config)) {\n  console.warn('Studio transactions are unsupported on aws-data-api; use a direct pg URL.');\n}","typeGuard":"// Detect the unsupported driver at the config boundary\nfunction supportsStudioTransactions(cfg: { driver?: string }): boolean {\n  return cfg.driver !== 'aws-data-api';\n}","tryCatchPattern":"try {\n  await db.transaction(async (tx) => { /* ... */ });\n} catch (e) {\n  if ((e as Error).message === 'Transaction not supported') {\n    // fall back to sequential, non-transactional statements\n  } else throw e;\n}","preventionTips":["Use a direct Postgres connection string for Studio, not aws-data-api.","Reserve the aws-data-api driver for runtime app code, not Studio authoring."],"tags":["drizzle-kit","studio","aws-data-api","transactions"],"analyzedSha":"b7862528fd8fc39bc2653a6c18dad7c1f4e68d10","analyzedAt":"2026-08-03T18:11:14.318Z","schemaVersion":2}