Prisma 7 Setup
Velox TS uses Prisma 7 with driver adapters. All scaffolded templates are pre-configured — this guide explains the setup if you need to understand or customize it.
How Prisma 7 Works
Section titled “How Prisma 7 Works”Prisma 7 uses driver adapters to connect to databases at runtime. Three configuration files work together:
prisma.config.ts— Tells the Prisma CLI where to find the schema and database URLprisma/schema.prisma— Defines your data model (no connection URL here)src/config/database.ts— Creates the runtime client with a driver adapter
// prisma.config.ts — CLI configurationimport 'dotenv/config';import { defineConfig } from 'prisma/config';
export default defineConfig({ schema: './prisma/schema.prisma', datasource: { url: process.env.DATABASE_URL, },});// schema.prisma — data model onlydatasource db { provider = "sqlite"}// database.ts — runtime client with adapterimport { 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 });This separation gives you full control over connection pooling, timeouts, and enables edge/serverless deployments.
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,},}); -
Define your schema in
prisma/schema.prisma:generator client {provider = "prisma-client-js"output = "../node_modules/.prisma/client"}datasource db {provider = "sqlite"}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';
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"Velox TS Integration
Section titled “Velox TS 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 Velox TS contextdeclare module '@veloxts/core' { interface BaseContext { db: PrismaClient; }}Use in procedures:
import { procedures, procedure, z } from '@veloxts/velox';
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: datasourceUrl is not a valid PrismaClient option in Prisma 7.
Fix: Use a driver adapter:
// WRONGconst db = new PrismaClient({ datasourceUrl: process.env.DATABASE_URL });
// CORRECTconst 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 present in schema.prisma datasource block.
Fix: Remove url from the schema — the database URL belongs in prisma.config.ts:
// WRONGdatasource db { provider = "sqlite" url = env("DATABASE_URL")}
// 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 5/6
Section titled “Migrating from Prisma 5/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 5/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
Related Content
Section titled “Related Content”- Driver Adapters - All adapter options
- Migrations - Schema changes
- Seeding - Test data