Driver Adapters
Prisma 7 requires driver adapters for database connections. Each adapter provides direct control over connection behavior, pooling, and configuration.
Supported Adapters
Section titled “Supported Adapters”| Database | Adapter Package | Driver | Best For |
|---|---|---|---|
| SQLite | @prisma/adapter-better-sqlite3 | better-sqlite3 | Development, testing |
| PostgreSQL | @prisma/adapter-pg | pg | Production |
SQLite (Development)
Section titled “SQLite (Development)”Zero-configuration local database. Ideal for development and testing.
pnpm add @prisma/adapter-better-sqlite3@7.2.0 better-sqlite3@11.9.1npm rebuild better-sqlite3 # Required for native bindingsimport { 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"}PostgreSQL (Production)
Section titled “PostgreSQL (Production)”Production-ready with connection pooling for high concurrency.
pnpm add @prisma/adapter-pg@7.2.0 pg@8.13.0pnpm add -D @types/pg@8.11.10import { PrismaPg } from '@prisma/adapter-pg';import { PrismaClient } from '@prisma/client';
// Prisma 7: Pass connectionString directlyconst adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL,});export const db = new PrismaClient({ adapter });import { PrismaPg } from '@prisma/adapter-pg';import { Pool } from 'pg';import { PrismaClient } from '@prisma/client';
// Create PostgreSQL connection poolconst pool = new Pool({ connectionString: process.env.DATABASE_URL, max: 20, // Maximum connections min: 5, // Minimum connections idleTimeoutMillis: 30000, // Close idle connections after 30s connectionTimeoutMillis: 2000,});
const adapter = new PrismaPg(pool);export const db = new PrismaClient({ adapter });
// Graceful shutdownprocess.on('SIGTERM', async () => { await db.$disconnect(); await pool.end();});Schema:
datasource db { provider = "postgresql"}
model User { id String @id @default(dbgenerated("gen_random_uuid()")) // ...}Environment:
DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"Connection Pooling Best Practices
Section titled “Connection Pooling Best Practices”Pool Size Guidelines
Section titled “Pool Size Guidelines”| Environment | Recommended Max | Notes |
|---|---|---|
| Development | 5 | Low concurrency |
| Production (small) | 10-20 | Single server |
| Production (scaled) | 5-10 per instance | Multiple servers share pool |
Serverless Considerations
Section titled “Serverless Considerations”For serverless environments (Vercel, AWS Lambda), use external connection poolers:
PgBouncer / Supabase:
# 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:
# Pooled endpointDATABASE_URL="postgresql://user:pass@ep-cool-name-123456.us-east-2.aws.neon.tech/neondb?sslmode=require"Graceful Shutdown
Section titled “Graceful Shutdown”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);Switching from SQLite to PostgreSQL
Section titled “Switching from SQLite to PostgreSQL”To switch from SQLite (development) to PostgreSQL (production):
-
Update dependencies:
Terminal window pnpm remove @prisma/adapter-better-sqlite3 better-sqlite3pnpm add @prisma/adapter-pg pg -
Update schema.prisma:
datasource db {provider = "postgresql" // Changed from "sqlite"} -
Update database client:
// Change adapter importimport { PrismaPg } from '@prisma/adapter-pg';const adapter = new PrismaPg({connectionString: process.env.DATABASE_URL,}); -
Update environment:
Terminal window DATABASE_URL="postgresql://user:pass@host:5432/db" -
Regenerate and migrate:
Terminal window pnpm prisma generatepnpm prisma migrate dev --name init
Performance Tips
Section titled “Performance Tips”Select Only Needed Fields
Section titled “Select Only Needed Fields”const users = await db.user.findMany({ select: { id: true, name: true, email: true, // Exclude password, timestamps if not needed },});Use Pagination
Section titled “Use Pagination”const users = await db.user.findMany({ skip: (page - 1) * pageSize, take: pageSize, orderBy: { createdAt: 'desc' },});Add Indexes
Section titled “Add Indexes”model User { id String @id @default(uuid()) email String @unique
@@index([email]) // Add index for frequent queries @@index([createdAt])}Next Steps
Section titled “Next Steps”- Prisma 7 Setup - Full configuration guide
- Migrations - Schema management
- Testing - Test patterns