Skip to content

Driver Adapters

Prisma 7 requires driver adapters for database connections. Each adapter provides direct control over connection behavior, pooling, and configuration.

DatabaseAdapter PackageDriverBest For
SQLite@prisma/adapter-better-sqlite3better-sqlite3Development, testing
PostgreSQL@prisma/adapter-pgpgProduction

Zero-configuration local database. Ideal for development and testing.

Terminal window
pnpm add @prisma/adapter-better-sqlite3@7.2.0 better-sqlite3@11.9.1
npm rebuild better-sqlite3 # Required for native bindings
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';
import { PrismaClient } from '@prisma/client';
const adapter = new PrismaBetterSqlite3({
url: process.env.DATABASE_URL, // "file:./dev.db"
});
export const db = new PrismaClient({ adapter });

Schema:

datasource db {
provider = "sqlite"
}

Production-ready with connection pooling for high concurrency.

Terminal window
pnpm add @prisma/adapter-pg@7.2.0 pg@8.13.0
pnpm add -D @types/pg@8.11.10
import { PrismaPg } from '@prisma/adapter-pg';
import { PrismaClient } from '@prisma/client';
// Prisma 7: Pass connectionString directly
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
});
export const db = new PrismaClient({ adapter });

Schema:

datasource db {
provider = "postgresql"
}
model User {
id String @id @default(dbgenerated("gen_random_uuid()"))
// ...
}

Environment:

Terminal window
DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"
EnvironmentRecommended MaxNotes
Development5Low concurrency
Production (small)10-20Single server
Production (scaled)5-10 per instanceMultiple servers share pool

For serverless environments (Vercel, AWS Lambda), use external connection poolers:

PgBouncer / Supabase:

Terminal window
# Direct connection (for migrations)
DIRECT_URL="postgresql://user:pass@db.project.supabase.co:5432/postgres"
# Pooled connection (for queries)
DATABASE_URL="postgresql://user:pass@db.project.supabase.co:6543/postgres?pgbouncer=true"

Neon:

Terminal window
# Pooled endpoint
DATABASE_URL="postgresql://user:pass@ep-cool-name-123456.us-east-2.aws.neon.tech/neondb?sslmode=require"

Always disconnect on shutdown to prevent connection leaks:

import { db } from './database';
// VeloxTS handles this automatically via the ORM plugin
// For manual setups:
const shutdown = async () => {
await db.$disconnect();
process.exit(0);
};
process.on('SIGTERM', shutdown);
process.on('SIGINT', shutdown);

To switch from SQLite (development) to PostgreSQL (production):

  1. Update dependencies:

    Terminal window
    pnpm remove @prisma/adapter-better-sqlite3 better-sqlite3
    pnpm add @prisma/adapter-pg pg
  2. Update schema.prisma:

    datasource db {
    provider = "postgresql" // Changed from "sqlite"
    }
  3. Update database client:

    // Change adapter import
    import { PrismaPg } from '@prisma/adapter-pg';
    const adapter = new PrismaPg({
    connectionString: process.env.DATABASE_URL,
    });
  4. Update environment:

    Terminal window
    DATABASE_URL="postgresql://user:pass@host:5432/db"
  5. Regenerate and migrate:

    Terminal window
    pnpm prisma generate
    pnpm prisma migrate dev --name init
const users = await db.user.findMany({
select: {
id: true,
name: true,
email: true,
// Exclude password, timestamps if not needed
},
});
const users = await db.user.findMany({
skip: (page - 1) * pageSize,
take: pageSize,
orderBy: { createdAt: 'desc' },
});
model User {
id String @id @default(uuid())
email String @unique
@@index([email]) // Add index for frequent queries
@@index([createdAt])
}