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   # SQLite

1) Add the generator

generator client {
  provider = "prisma-client"
}

generator sql {
  provider = "prisma-sql-generator"
}

2) Generate

npx prisma generate

This 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

  • findMany
  • findFirst
  • findUnique
  • count
  • aggregate
  • groupBy
  • $batch (PostgreSQL)

Runs through Prisma as before

  • create, update, delete, upsert
  • createMany, 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.

Next steps