drizzle-team/drizzle-orm · error · Error

Method not implemented.

Error message

Method not implemented.

What it means

PrismaSQLitePreparedQuery.values() throws 'Method not implemented.' The Prisma SQLite adapter implements all()/run()/get()/execute() through $queryRawUnsafe but does not implement values() (the raw driver-value/typed-value extraction path), because Prisma's raw query API does not expose driver-level typed values.

Source

Thrown at drizzle-orm/src/prisma/sqlite/session.ts:50

	override all(placeholderValues?: Record<string, unknown>): Promise<T['all']> {
		const params = fillPlaceholders(this.query.params, placeholderValues ?? {});
		this.logger.logQuery(this.query.sql, params);
		return this.prisma.$queryRawUnsafe(this.query.sql, ...params);
	}

	override async run(placeholderValues?: Record<string, unknown> | undefined): Promise<[]> {
		await this.all(placeholderValues);
		return [];
	}

	override async get(placeholderValues?: Record<string, unknown> | undefined): Promise<T['get']> {
		const all = await this.all(placeholderValues) as unknown[];
		return all[0];
	}

	override values(_placeholderValues?: Record<string, unknown> | undefined): Promise<never> {
		throw new Error('Method not implemented.');
	}

	override isResponseInArrayMode(): boolean {
		return false;
	}
}

export interface PrismaSQLiteSessionOptions {
	logger?: Logger;
}

export class PrismaSQLiteSession extends SQLiteSession<'async', unknown, Record<string, never>, Record<string, never>> {
	static override readonly [entityKind]: string = 'PrismaSQLiteSession';

	private readonly logger: Logger;

	constructor(
		private readonly prisma: PrismaClient,

View on GitHub (pinned to b7862528fd)

Solutions

  1. Use .all() / .get() / .execute() instead of .values() to obtain row objects.
  2. Switch to a native Drizzle SQLite driver (better-sqlite3, libSQL, d1) if raw typed values are required.
  3. Map row object fields to typed values manually if specific driver types are needed.

Example fix

// before (throws)
const rows = await preparedQuery.values();

// after
const rows = await preparedQuery.all();
Defensive patterns

Strategy: validation

Validate before calling

import { entityKind } from 'drizzle-orm/entity';

function isPrismaSqlitePrepared(q: any): boolean {
  return q?.[entityKind] === 'PrismaSQLitePreparedQuery';
}

const rows = isPrismaSqlitePrepared(stmt) ? await stmt.all() : await stmt.values();

Type guard

function isPrismaSqlitePreparedQuery(q: unknown): boolean {
  return (q as any)?.[Symbol.for('drizzle:entityKind')] === 'PrismaSQLitePreparedQuery';
}

Try / catch

try {
  const v = await stmt.values();
} catch (e) {
  if (e instanceof Error && e.message === 'Method not implemented.') {
    const rows = await stmt.all();
  } else throw e;
}

Prevention

When it happens

Trigger: Calling .values() on a prepared query from a Prisma-backed SQLite Drizzle instance, or reaching an internal path that uses values() (some low-level typed-result helpers).

Common situations: Using Drizzle over Prisma for SQLite (e.g., Turso/Prisma), then calling typed value extraction. Migrating from better-sqlite3/libsql driver code that used values().

Related errors


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