Getting started
prisma-sql accelerates Prisma read queries by skipping Prisma's read execution path and running generated SQL directly through a database-native client. Prisma stays the source of truth for schema, migrations, generated types, writes, and fallback.
Installation
npm install prisma-sql postgres # PostgreSQL
npm install prisma-sql better-sqlite3 # SQLite1) Add the generator
generator client {
provider = "prisma-client"
}
generator sql {
provider = "prisma-sql-generator"
}2) Generate
npx prisma generateThis emits ./generated/sql/index.ts (the extension) and ./generated/sql/planner.generated.ts(relation and model statistics used by the strategy planner).
3) Extend Prisma
PostgreSQL
import { PrismaClient } from '@prisma/client'
import { speedExtension, type SpeedClient } from './generated/sql'
import postgres from 'postgres'
const sql = postgres(process.env.DATABASE_URL!)
const basePrisma = new PrismaClient()
export const prisma = basePrisma.$extends(
speedExtension({ postgres: sql }),
) as SpeedClient<typeof basePrisma>SQLite
import { speedExtension, type SpeedClient } from './generated/sql'
import Database from 'better-sqlite3'
const db = new Database('./data.db')
const basePrisma = new PrismaClient()
export const prisma = basePrisma.$extends(
speedExtension({ sqlite: db }),
) as SpeedClient<typeof basePrisma>With existing extensions
Apply speedExtension last so it sees the final query surface.
const extendedPrisma = basePrisma
.$extends(myCustomExtension)
.$extends(anotherExtension)
export const prisma = extendedPrisma.$extends(
speedExtension({ postgres: sql }),
) as SpeedClient<typeof extendedPrisma>What gets accelerated
Accelerated reads
findManyfindFirstfindUniquecountaggregategroupBy$batch(PostgreSQL)
Runs through Prisma as before
create,update,delete,upsertcreateMany,updateMany,deleteMany- full-text
search - embedded/composite document types
Fallback rule: when the SQL builder rejects a query shape, the query falls back to Prisma. Enabledebug: true to see when that happens. Some shapes are accelerated but can return a different result than Prisma; the Prisma parity map lists them.