Prisma 7 Setup
VeloxTS uses Prisma 7, which introduces significant architectural changes from previous versions.
What Changed in Prisma 7?
Section titled “What Changed in Prisma 7?”datasource db { provider = "sqlite" url = env("DATABASE_URL") // URL configured here}import { PrismaClient } from '@prisma/client';export const db = new PrismaClient(); // Just worksdatasource db { provider = "sqlite" // NO url field - configured in prisma.config.ts}// prisma.config.ts (NEW - required)import 'dotenv/config';import { defineConfig } from 'prisma/config';
export default defineConfig({ schema: './prisma/schema.prisma', datasource: { url: process.env.DATABASE_URL, },});import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';import { PrismaClient } from '@prisma/client';
const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL! });export const db = new PrismaClient({ adapter }); // Adapter requiredWhy Driver Adapters?
Section titled “Why Driver Adapters?”- Separation of concerns: CLI configuration (migrations) separate from runtime (client)
- Connection control: Full control over pooling, timeouts, and behavior
- Edge support: Enables serverless and edge deployments
- Type safety: Type-safe adapter configuration
Quick Setup
Section titled “Quick Setup”-
Create
prisma.config.tsat project root:import 'dotenv/config';import { defineConfig } from 'prisma/config';export default defineConfig({schema: './prisma/schema.prisma',datasource: {url: process.env.DATABASE_URL,},}); -
Update
prisma/schema.prisma(remove url field):generator client {provider = "prisma-client-js"output = "../node_modules/.prisma/client"}datasource db {provider = "sqlite"// NO url here - it's in prisma.config.ts}model User {id String @id @default(uuid())name Stringemail String @uniquecreatedAt DateTime @default(now())updatedAt DateTime @updatedAt@@map("users")} -
Create database client at
src/config/database.ts:import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';import { PrismaClient } from '@prisma/client';if (!process.env.DATABASE_URL) {throw new Error('DATABASE_URL environment variable is required');}const adapter = new PrismaBetterSqlite3({url: process.env.DATABASE_URL,});export const db = new PrismaClient({ adapter }); -
Set environment variable in
.env:Terminal window DATABASE_URL="file:./dev.db" -
Generate client and push schema:
Terminal window pnpm prisma generatepnpm prisma db push
Database-Specific Setup
Section titled “Database-Specific Setup”SQLite (Development)
Section titled “SQLite (Development)”Best for local development, testing, and demos.
Dependencies:
{ "@prisma/adapter-better-sqlite3": "7.2.0", "@prisma/client": "7.2.0", "better-sqlite3": "11.9.1", "prisma": "7.2.0"}Configuration:
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 });PostgreSQL (Production)
Section titled “PostgreSQL (Production)”Best for production applications with high concurrency.
Dependencies:
{ "@prisma/adapter-pg": "7.2.0", "@prisma/client": "7.2.0", "pg": "8.13.0", "prisma": "7.2.0"}Configuration:
import { PrismaPg } from '@prisma/adapter-pg';import { PrismaClient } from '@prisma/client';
// Pass connectionString directly (Prisma 7 pattern)const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL,});export const db = new PrismaClient({ adapter });Environment:
DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"VeloxTS Integration
Section titled “VeloxTS Integration”Extend the context to include your Prisma client:
import type { BaseContext } from '@veloxts/core';import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';import { PrismaClient } from '@prisma/client';
const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL!,});
export const db = new PrismaClient({ adapter });
// Extend VeloxTS contextdeclare module '@veloxts/core' { interface BaseContext { db: PrismaClient; }}Use in procedures:
import { procedures, procedure } from '@veloxts/velox';import { z } from 'zod';
export const userProcedures = procedures('users', { listUsers: procedure() .query(({ ctx }) => ctx.db.user.findMany()),
getUser: procedure() .input(z.object({ id: z.string().uuid() })) .query(({ input, ctx }) => ctx.db.user.findUniqueOrThrow({ where: { id: input.id }, })),});Common Errors
Section titled “Common Errors””Unknown property datasourceUrl”
Section titled “”Unknown property datasourceUrl””Cause: Prisma 7 removed datasourceUrl from PrismaClient constructor.
Fix: Use a driver adapter instead:
// WRONG (Prisma 6 pattern)const db = new PrismaClient({ datasourceUrl: process.env.DATABASE_URL });
// CORRECT (Prisma 7 pattern)const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL! });const db = new PrismaClient({ adapter });“The datasource property ‘url’ is no longer supported”
Section titled ““The datasource property ‘url’ is no longer supported””Cause: url field in schema.prisma datasource block.
Fix: Remove url from schema, configure in prisma.config.ts:
// WRONGdatasource db { provider = "sqlite" url = env("DATABASE_URL") // Remove this}
// CORRECTdatasource db { provider = "sqlite"}“Cannot find module ‘better-sqlite3’”
Section titled ““Cannot find module ‘better-sqlite3’””Cause: Native module not rebuilt after installation.
Fix:
npm rebuild better-sqlite3“PrismaBetterSQLite3 is not a constructor”
Section titled ““PrismaBetterSQLite3 is not a constructor””Cause: Incorrect class name casing.
Fix: Use PrismaBetterSqlite3 (lowercase “qlite”):
// WRONGimport { PrismaBetterSQLite3 } from '@prisma/adapter-better-sqlite3';
// CORRECTimport { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';“ENOENT: no such file or directory”
Section titled ““ENOENT: no such file or directory””Cause: Database path relative to wrong directory.
Fix: Paths are relative to project root (where prisma.config.ts is):
# CORRECTDATABASE_URL="file:./dev.db"
# WRONG (if running from src/)DATABASE_URL="file:../dev.db"Migrating from Prisma 6
Section titled “Migrating from Prisma 6”-
Update dependencies:
Terminal window pnpm add @prisma/client@7.2.0 @prisma/adapter-better-sqlite3@7.2.0pnpm add -D prisma@7.2.0 -
Remove url from schema:
datasource db {provider = "sqlite"url = env("DATABASE_URL")} -
Create
prisma.config.ts:import 'dotenv/config';import { defineConfig } from 'prisma/config';export default defineConfig({schema: './prisma/schema.prisma',datasource: {url: process.env.DATABASE_URL!,},}); -
Update database client:
// Before (Prisma 6)import { PrismaClient } from '@prisma/client';export const db = new PrismaClient();// After (Prisma 7)import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';import { PrismaClient } from '@prisma/client';const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL! });export const db = new PrismaClient({ adapter }); -
Rebuild and regenerate:
Terminal window npm rebuild better-sqlite3pnpm prisma generate
Troubleshooting Checklist
Section titled “Troubleshooting Checklist”- Prisma version is 7.x:
pnpm list prisma - Adapter package installed:
pnpm list @prisma/adapter-* - Native module rebuilt (SQLite):
npm rebuild better-sqlite3 - No
urlfield inschema.prismadatasource -
prisma.config.tsexists with correct URL -
DATABASE_URLenvironment variable is set - Prisma client generated:
pnpm prisma generate - Database schema pushed:
pnpm prisma db push
Next Steps
Section titled “Next Steps”- Driver Adapters - All adapter options
- Migrations - Schema changes
- Seeding - Test data