drizzle-team/drizzle-orm · error · Error
Transaction not supported
Error message
Transaction not supported
What it means
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.
Source
Thrown at drizzle-kit/src/cli/connections.ts:113
>(
{
sql: params.sql,
params: params.params ?? [],
typings: params.typings,
},
undefined,
undefined,
params.mode === 'array',
);
if (params.mode === 'array') {
const result = await prepared.values();
return result.rows;
}
const result = await prepared.execute();
return result.rows;
};
const transactionProxy: TransactionProxy = async (queries) => {
throw new Error('Transaction not supported');
};
return {
packageName: '@aws-sdk/client-rds-data',
query,
proxy,
transactionProxy,
migrate: migrateFn,
};
}
if (driver === 'pglite') {
assertPackages('@electric-sql/pglite');
const { PGlite, types } = await import('@electric-sql/pglite');
const { drizzle } = await import('drizzle-orm/pglite');
const { migrate } = await import('drizzle-orm/pglite/migrator');
const pglite = 'client' in credentials ? credentials.client : new PGlite(normalisePGliteUrl(credentials.url));View on GitHub (pinned to b7862528fd)
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.
Example fix
// before (drizzle.config.ts)
export default defineConfig({ dialect: 'postgresql', driver: 'aws-data-api', /* ... */ });
// after - use a direct connection for Studio
export default defineConfig({ dialect: 'postgresql', dbCredentials: { url: process.env.PG_URL! } }); Defensive patterns
Strategy: validation
Validate before calling
// Before launching Studio for aws-data-api, gate transactional use:
import type { DrizzleConfig } from 'drizzle-orm';
const isAwsDataApi = (c: any) => c.driver === 'aws-data-api';
if (isAwsDataApi(config)) {
console.warn('Studio transactions are unsupported on aws-data-api; use a direct pg URL.');
} Type guard
// Detect the unsupported driver at the config boundary
function supportsStudioTransactions(cfg: { driver?: string }): boolean {
return cfg.driver !== 'aws-data-api';
} Try / catch
try {
await db.transaction(async (tx) => { /* ... */ });
} catch (e) {
if ((e as Error).message === 'Transaction not supported') {
// fall back to sequential, non-transactional statements
} else throw e;
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- unsupported dialect
- unsupported relation type
- Invalid relation "${relation.fieldName}" for table "${it.sch
- Custom default not found for ${column.schema}.${column.table
- Unknown type: ${type}
AI-assisted analysis of drizzle-team/drizzle-orm@b7862528fd (2026-08-03).
Data as JSON: /data/errors/13ec1eeee642a094.json.
Report an issue: GitHub.