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

  1. 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.
  2. Avoid operations in Studio that batch multiple statements in one transaction; run them individually.
  3. 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

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


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