
Prisma Upgrade V7
- 7 installs
- 2 repo stars
- Updated July 1, 2026
- prisma/prisma-plugin
This is a copy of prisma-upgrade-v7 by prisma - installs and ranking accrue to the original listing.
prisma-upgrade-v7 is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
Key points
- prisma-upgrade-v7
- AI & Agent Building
- AI-coding skill
Prisma Upgrade V7 by the numbers
- 7 all-time installs (skills.sh)
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/prisma/prisma-plugin --skill prisma-upgrade-v7Add your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 7 |
|---|---|
| repo stars | ★ 2 |
| Last updated | July 1, 2026 |
| Repository | prisma/prisma-plugin ↗ |
How do I helps with ai & agent building tasks during ai-assisted development?
Helps with ai & agent building tasks during AI-assisted development.
Who is it for?
Best when you're working on ai & agent building and need structured help with prisma-upgrade-v7.
Skip if: Teams with no ai & agent building needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with ai & agent building tasks during ai-assisted development, or when prisma-upgrade-v7 is a claude code skill for ai & agent building. it helps solo builders move faster with ai-assisted coding.
What you get
Structured output aligned to prisma-upgrade-v7: prisma-upgrade-v7; AI & Agent Building; AI-coding skill.
Files
Upgrade to Prisma ORM 7
Complete guide for migrating from Prisma ORM v6 to v7. This upgrade introduces significant breaking changes around the new prisma-client generator, driver adapters, prisma.config.ts, explicit environment loading, and generated client entrypoints.
When to Apply
Reference this skill when:
- Upgrading from Prisma v6 to v7
- Updating to the
prisma-clientgenerator - Setting up driver adapters
- Configuring
prisma.config.ts - Fixing import errors after upgrade
Rule Categories by Priority
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Schema Migration | CRITICAL | schema-changes |
| 2 | Database Connectivity | CRITICAL | driver-adapters |
| 3 | Module System | CRITICAL | esm-support |
| 4 | Config and Env | HIGH | prisma-config, env-variables |
| 5 | Removed Features | HIGH | removed-features |
| 6 | Accelerate | HIGH | accelerate-users |
Quick Reference
schema-changes- generator migration, required output paths, generated entrypoints, andPrisma.validatorreplacementdriver-adapters- required adapter installation for SQL providers, pool differences, and Prisma Postgres adapter choicesesm-support- ESM-first setup plus CommonJS fallback withmoduleFormat = "cjs"prisma-config- creating and usingprisma.config.tsenv-variables- explicit environment loadingremoved-features- removed middleware, metrics, and legacy CLI behavioraccelerate-users- migration notes for Accelerate users
Important Notes
- MongoDB projects should stay on Prisma 6.x - do not migrate MongoDB apps to Prisma 7's SQL client path
- Node.js 20.19.0+ required
- TypeScript 5.4.0+ required
- Latest stable Prisma ORM version:
7.8.0
Upgrade Steps Overview
1. Update packages to v7 2. Choose your module format (esm by default, cjs if needed) 3. Update TypeScript configuration 4. Update the schema generator block 5. Create prisma.config.ts 6. Install and configure a driver adapter for SQL providers 7. Update Prisma Client imports 8. Update client instantiation 9. Replace deprecated helper patterns like Prisma.validator 10. Run prisma generate and test
Quick Upgrade Commands
# Update packages
npm install @prisma/client@7
npm install -D prisma@7
# Install a driver adapter (PostgreSQL or Prisma Postgres via direct TCP)
npm install @prisma/adapter-pg pg
# Install dotenv for env loading
npm install dotenv
# Regenerate client
npx prisma generateBreaking Changes Summary
| Change | v6 | v7 |
|---|---|---|
| Module format | Implicit / mixed | ESM-first, moduleFormat = "cjs" supported |
| Generator provider | prisma-client-js | prisma-client is the default, while prisma-client-js still exists for legacy setups |
| Output path | Auto (node_modules) | Required explicit |
| Driver adapters | Optional | Required for SQL providers |
| Config file | .env + schema | prisma.config.ts |
| Env loading | Automatic | Manual (dotenv) |
| Generated entrypoints | Single package export | client, browser, models, enums entrypoints |
| Type-safe query fragments | Prisma.validator() | TypeScript satisfies |
| Middleware | $use() | Client Extensions |
| Metrics | Preview feature | Removed |
Rule Files
Detailed migration guides for each breaking change:
references/esm-support.md - ESM and CommonJS configuration
references/schema-changes.md - Generator, output, imports, and generated entrypoints
references/driver-adapters.md - Required driver adapter setup
references/prisma-config.md - New configuration file
references/env-variables.md - Environment variable loading
references/removed-features.md - Middleware, metrics, and CLI flags
references/accelerate-users.md - Special handling for AccelerateStep-by-Step Migration
1. Update package.json for ESM-first projects
{
"type": "module"
}If you need to stay on CommonJS, keep your app as CJS and set moduleFormat = "cjs" in the generator block instead of forcing ESM.
2. Update tsconfig.json
{
"compilerOptions": {
"module": "ESNext",
"moduleResolution": "bundler",
"target": "ES2023",
"strict": true,
"esModuleInterop": true
}
}3. Update schema.prisma
// Before (v6)
generator client {
provider = "prisma-client-js"
}
// After (v7)
generator client {
provider = "prisma-client"
output = "../generated/prisma"
// Optional if you need CommonJS:
// moduleFormat = "cjs"
}4. Create prisma.config.ts
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: env('DATABASE_URL'),
},
})5. Install a driver adapter (SQL providers only)
# PostgreSQL
npm install @prisma/adapter-pg pg
# MySQL
npm install @prisma/adapter-mariadb mariadb
# SQLite
npm install @prisma/adapter-better-sqlite3 better-sqlite3
# Prisma Postgres in standard Node.js apps (recommended)
npm install @prisma/adapter-pg pg
# Prisma Postgres serverless driver (edge/serverless)
npm install @prisma/adapter-ppg @prisma/ppg
# Neon
npm install @prisma/adapter-neonMongoDB does not have a SQL @prisma/adapter-* package in the published Prisma 7 packages. If you're upgrading a MongoDB project, stop and keep that project on the latest Prisma 6.x release instead of following the standard Prisma 7 migration path.
6. Update client instantiation
// Before (v6)
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
// After (v7)
import { PrismaClient } from '../generated/prisma/client'
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL
})
const prisma = new PrismaClient({ adapter })7. Replace Prisma.validator with satisfies
import { Prisma } from '../generated/prisma/client'
const userSelect = {
id: true,
email: true,
name: true,
} satisfies Prisma.UserSelect8. Run migrations and generate
npx prisma generate
npx prisma migrate dev # if neededTroubleshooting
"Cannot find module" errors
- Check that the generator
outputpath matches your import path - Ensure
prisma generateran successfully
SSL certificate errors
- Add
ssl: { rejectUnauthorized: false }to the adapter config if you need to preserve old behavior - Or configure your certificates properly with
NODE_EXTRA_CA_CERTS/ OpenSSL CA settings
Connection timeout issues
- Driver adapters use the underlying driver's defaults, which differ from v6
- Configure pool settings explicitly on the adapter if needed
Resources
How to Use
Follow references/schema-changes.md and references/driver-adapters.md first, then apply the remaining reference files based on your project setup.
Prisma Accelerate Users
Special migration instructions for users of Prisma Accelerate or Prisma Postgres with prisma:// or prisma+postgres:// URLs.
Important
Do NOT pass Accelerate URLs to driver adapters.
Driver adapters (like PrismaPg) expect direct database connection strings. They will fail with prisma:// or prisma+postgres:// URLs.
Correct v7 Setup for Accelerate
1. Keep your Accelerate URL
# .env
DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=..."
# or
DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/..."2. Install Accelerate extension
npm install @prisma/extension-accelerate3. Configure prisma.config.ts
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
datasource: {
url: env('DATABASE_URL'), // Accelerate URL works here
},
})4. Instantiate client with accelerateUrl
import { PrismaClient } from '../generated/client'
import { withAccelerate } from '@prisma/extension-accelerate'
// Use accelerateUrl instead of adapter
export const prisma = new PrismaClient({
accelerateUrl: process.env.DATABASE_URL,
}).$extends(withAccelerate())What NOT to Do
// ❌ WRONG - Don't use adapter with Accelerate URL
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL // This will fail with prisma://
})Migrations with Accelerate
For migrations, you may need a direct database connection:
Option 1: Use Accelerate URL for everything
Accelerate URLs work with Prisma CLI commands:
# Works with Accelerate URL
prisma migrate deploy
prisma db pushOption 2: Use direct URL for migrations
DATABASE_URL="prisma+postgres://..." # For app
DIRECT_DATABASE_URL="postgresql://..." # For migrations// prisma.config.ts
export default defineConfig({
datasource: {
url: env('DIRECT_DATABASE_URL'), // Direct URL for CLI
},
})Prisma Postgres (Cloud)
If using Prisma Postgres cloud database:
Same approach
import { PrismaClient } from '../generated/client'
import { withAccelerate } from '@prisma/extension-accelerate'
export const prisma = new PrismaClient({
accelerateUrl: process.env.DATABASE_URL, // prisma+postgres:// URL
}).$extends(withAccelerate())Switching Away from Accelerate
If you later switch to direct TCP connection:
// Change from accelerateUrl to adapter
import { PrismaClient } from '../generated/client'
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL // Direct postgres:// URL
})
export const prisma = new PrismaClient({ adapter })Caching with Accelerate
The extension enables caching:
const users = await prisma.user.findMany({
cacheStrategy: {
ttl: 60, // Cache for 60 seconds
swr: 120, // Stale-while-revalidate for 120 seconds
},
})Edge Runtime
Accelerate works great in edge runtimes:
// Works in Vercel Edge, Cloudflare Workers, etc.
import { PrismaClient } from '../generated/client'
import { withAccelerate } from '@prisma/extension-accelerate'
export const prisma = new PrismaClient({
accelerateUrl: process.env.DATABASE_URL,
}).$extends(withAccelerate())Driver Adapters
Prisma v7 requires driver adapters for SQL database connections. This is the standard SQL execution path in current Prisma releases.
MongoDB should not follow this path. There is no published MongoDB @prisma/adapter-* package, and MongoDB projects should remain on the latest Prisma 6.x release instead of trying to fit into the Prisma 7 SQL adapter model.
Why Driver Adapters?
- No native engine binary in the Prisma Client SQL path
- Smaller bundle size
- Better serverless/edge compatibility
- Uses native Node.js database drivers
- More control over connection pooling
Available Adapters
| Database | Adapter Package | Underlying Driver |
|---|---|---|
| PostgreSQL | @prisma/adapter-pg | pg |
| MySQL / MariaDB | @prisma/adapter-mariadb | mariadb |
| SQLite | @prisma/adapter-better-sqlite3 | better-sqlite3 |
| Prisma Postgres (Node.js) | @prisma/adapter-pg | pg |
| Prisma Postgres (edge/serverless) | @prisma/adapter-ppg | @prisma/ppg |
| SQL Server | @prisma/adapter-mssql | mssql |
| Neon | @prisma/adapter-neon | @neondatabase/serverless |
| PlanetScale | @prisma/adapter-planetscale | @planetscale/database |
| Turso/libSQL | @prisma/adapter-libsql | @libsql/client |
| D1 (Cloudflare) | @prisma/adapter-d1 | Cloudflare D1 |
Installation
PostgreSQL
npm install @prisma/adapter-pgMySQL
npm install @prisma/adapter-mariadb mariadbSQLite
npm install @prisma/adapter-better-sqlite3Prisma Postgres
npm install @prisma/adapter-pg pgSQL Server
npm install @prisma/adapter-mssql mssqlConfiguration
PostgreSQL
import { PrismaClient } from '../generated/client'
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL
})
const prisma = new PrismaClient({ adapter })MySQL
import { PrismaClient } from '../generated/client'
import { PrismaMariaDb } from '@prisma/adapter-mariadb'
const adapter = new PrismaMariaDb({
host: 'localhost',
port: 3306,
connectionLimit: 5,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASSWORD,
database: process.env.MYSQL_DATABASE,
})
const prisma = new PrismaClient({ adapter })SQLite
import { PrismaClient } from '../generated/client'
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'
const adapter = new PrismaBetterSqlite3({
url: process.env.DATABASE_URL || 'file:./dev.db'
})
const prisma = new PrismaClient({ adapter })Neon (Serverless PostgreSQL)
import { PrismaClient } from '../generated/client'
import { PrismaNeon } from '@prisma/adapter-neon'
const adapter = new PrismaNeon({
connectionString: process.env.DATABASE_URL
})
const prisma = new PrismaClient({ adapter })Prisma Postgres
import { PrismaClient } from '../generated/client'
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
})
const prisma = new PrismaClient({ adapter })Prisma Postgres serverless driver
import { PrismaClient } from '../generated/client'
import { PrismaPostgresAdapter } from '@prisma/adapter-ppg'
const prisma = new PrismaClient({
adapter: new PrismaPostgresAdapter({
connectionString: process.env.PRISMA_DIRECT_TCP_URL,
}),
})SQL Server
import { PrismaClient } from '../generated/client'
import { PrismaMssql } from '@prisma/adapter-mssql'
const adapter = new PrismaMssql({
server: 'localhost',
port: 1433,
database: 'mydb',
user: process.env.SQLSERVER_USER,
password: process.env.SQLSERVER_PASSWORD,
options: {
encrypt: true,
trustServerCertificate: true,
},
})
const prisma = new PrismaClient({ adapter })Connection Pool Configuration
Driver adapters use the underlying driver's pool settings, which differ from v6 defaults.
PostgreSQL with custom pool
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
// Pool configuration
max: 10, // Maximum connections
idleTimeoutMillis: 30000, // Close idle connections after 30s
connectionTimeoutMillis: 5000, // Connection timeout (v6 default was 5s)
})Matching v6 behavior
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
connectionTimeoutMillis: 5000, // v6 used 5 second timeout
})SSL Configuration
Accept self-signed certificates
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false // Accept self-signed certs
}
})Proper SSL configuration
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL,
ssl: {
ca: fs.readFileSync('/path/to/ca-cert.pem'),
rejectUnauthorized: true
}
})Migration from v6
Before (v6)
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient({
datasources: {
db: { url: process.env.DATABASE_URL }
}
})After (v7)
import { PrismaClient } from '../generated/client'
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL
})
const prisma = new PrismaClient({ adapter })Singleton Pattern
// lib/prisma.ts
import { PrismaClient } from '../generated/client'
import { PrismaPg } from '@prisma/adapter-pg'
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined
}
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL!
})
export const prisma = globalForPrisma.prisma ?? new PrismaClient({ adapter })
if (process.env.NODE_ENV !== 'production') {
globalForPrisma.prisma = prisma
}Environment Variables
Prisma v7 no longer automatically loads environment variables. You must load them explicitly.
The Change
v6 Behavior
Prisma CLI automatically loaded .env files.
v7 Behavior
You must manually load environment variables using dotenv or similar.
Setup
1. Install dotenv
npm install dotenv2. Import in prisma.config.ts
import 'dotenv/config' // Must be first import
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
datasource: {
url: env('DATABASE_URL'),
},
})Bun Users
Bun automatically loads .env files. No additional setup needed:
// prisma.config.ts (Bun)
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
datasource: {
url: env('DATABASE_URL'),
},
})Multiple .env Files
Using dotenv-cli
npm install -D dotenv-cli{
"scripts": {
"db:migrate": "dotenv -e .env.local -- prisma migrate dev",
"db:push": "dotenv -e .env.development -- prisma db push"
}
}Using dotenv with path
// prisma.config.ts
import { config } from 'dotenv'
import path from 'path'
// Load specific .env file
config({ path: path.join(__dirname, '.env.local') })
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
datasource: {
url: env('DATABASE_URL'),
},
})Application Code
For your application, load env vars at startup:
Entry point
// index.ts
import 'dotenv/config'
import { PrismaClient } from '../generated/client'
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({
connectionString: process.env.DATABASE_URL!
})
const prisma = new PrismaClient({ adapter })Or use dotenv explicitly
import { config } from 'dotenv'
config()
// Now process.env.DATABASE_URL is availableRemoved Environment Variables
These Prisma-specific env vars are removed in v7:
| Removed Variable | Alternative |
|---|---|
PRISMA_CLI_QUERY_ENGINE_TYPE | Not needed (no engines) |
PRISMA_CLIENT_ENGINE_TYPE | Not needed (no engines) |
PRISMA_QUERY_ENGINE_BINARY | Not needed |
PRISMA_QUERY_ENGINE_LIBRARY | Not needed |
PRISMA_GENERATE_SKIP_AUTOINSTALL | Not needed |
PRISMA_SKIP_POSTINSTALL_GENERATE | Not needed |
PRISMA_GENERATE_IN_POSTINSTALL | Not needed |
PRISMA_GENERATE_DATAPROXY | Migrate to prisma-client with driver adapters |
PRISMA_GENERATE_NO_ENGINE | Migrate to prisma-client with driver adapters |
PRISMA_CLIENT_NO_RETRY | Configure on adapter |
PRISMA_MIGRATE_SKIP_GENERATE | Not needed (auto-generate removed) |
PRISMA_MIGRATE_SKIP_SEED | Not needed (auto-seed removed) |
TypeScript env() Helper
The env() function from prisma/config provides type safety:
import { env } from 'prisma/config'
// Type-safe environment variable access
const url = env('DATABASE_URL') // stringNote: This only works within prisma.config.ts, not in your application code.
CI/CD Considerations
Ensure environment variables are set in your CI environment:
# GitHub Actions
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
steps:
- run: npx prisma migrate deployNo need for dotenv in CI if variables are set directly.
ESM and CommonJS Support
Prisma ORM v7 is ESM-first, but the prisma-client generator can target either ESM or CommonJS. Use ESM by default, and opt into CommonJS with moduleFormat = "cjs" if your project still needs it.
ESM Projects
Add "type": "module" to package.json and use an ESM-compatible tsconfig.json:
{
"type": "module",
"scripts": {
"build": "tsc",
"start": "node dist/index.js"
}
}{
"compilerOptions": {
"module": "ESNext",
"moduleResolution": "bundler",
"target": "ES2023",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"outDir": "dist"
},
"include": ["src/**/*", "prisma/**/*"]
}CommonJS Projects
If the rest of your app is still CommonJS, keep that setup and make the generated Prisma Client CommonJS too:
{
"compilerOptions": {
"module": "CommonJS",
"moduleResolution": "node",
"target": "ES2022",
"esModuleInterop": true
}
}generator client {
provider = "prisma-client"
output = "../generated/prisma"
moduleFormat = "cjs"
}Generator Fields That Matter
moduleFormat:esmorcjsruntime:nodejs,bun,deno,workerd,vercel-edge,react-nativegeneratedFileExtension:ts,mts, orctsimportFileExtension:ts,mts,cts,js,mjs,cjs, or empty
Example:
generator client {
provider = "prisma-client"
output = "../generated/prisma"
runtime = "nodejs"
moduleFormat = "esm"
generatedFileExtension = "ts"
importFileExtension = "ts"
}Import Paths
Server Code
import { PrismaClient } from '../generated/prisma/client'Browser-Safe Types
import { Prisma } from '../generated/prisma/browser'
import { Role } from '../generated/prisma/enums'
import type { UserModel } from '../generated/prisma/models/User'File Extensions
With moduleResolution: "Node16" or "NodeNext", use .js/.mjs/.cjs extensions that match your emitted files.
With moduleResolution: "bundler", bare relative imports are usually fine.
Minimum Versions
| Requirement | Minimum Version |
|---|---|
| Node.js | 20.19.0 |
| TypeScript | 5.4.0 |
Framework Considerations
Next.js
Next.js works well with the default ESM output. If you need generated types in client components, import them from browser, models, or enums, not from client.
Bun
Bun loads .env files automatically, so ESM plus env() is the smoothest default. You can still choose moduleFormat = "cjs" if the rest of your project requires it.
Troubleshooting
"ERR_REQUIRE_ESM"
Your generated client is ESM, but your app is requiring it as CommonJS. Either switch the project to ESM or set moduleFormat = "cjs" and regenerate.
"Cannot use import statement outside a module"
Your app is still being executed as CommonJS. Add "type": "module" or use moduleFormat = "cjs" instead.
TypeScript compilation errors
Ensure module, moduleResolution, and your generator's moduleFormat agree with one another.
Prisma Config
Prisma v7 introduces prisma.config.ts as the central configuration file for the Prisma CLI.
Location
Place prisma.config.ts at your project root (next to package.json).
Basic Configuration
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: env('DATABASE_URL'),
},
})Configuration Options
schema
Path to your Prisma schema file:
schema: 'prisma/schema.prisma'datasource.url
Database connection URL:
datasource: {
url: env('DATABASE_URL'),
}datasource.directUrl
Direct connection URL (bypassing connection pooler):
datasource: {
url: env('DATABASE_URL'),
directUrl: env('DIRECT_DATABASE_URL'),
}datasource.shadowDatabaseUrl
Shadow database for migrations:
datasource: {
url: env('DATABASE_URL'),
shadowDatabaseUrl: env('SHADOW_DATABASE_URL'),
}migrations.path
Directory for migration files:
migrations: {
path: 'prisma/migrations',
}migrations.seed
Seed command for prisma db seed:
migrations: {
path: 'prisma/migrations',
seed: 'tsx prisma/seed.ts',
}Full Example
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
// Schema location
schema: 'prisma/schema.prisma',
// Migration configuration
migrations: {
path: 'prisma/migrations',
seed: 'tsx prisma/seed.ts',
},
// Database connection
datasource: {
url: env('DATABASE_URL'),
directUrl: env('DIRECT_DATABASE_URL'),
shadowDatabaseUrl: env('SHADOW_DATABASE_URL'),
},
})Environment Variables
The env() helper
Use env() to reference environment variables:
import { env } from 'prisma/config'
datasource: {
url: env('DATABASE_URL'),
}This provides type safety but does NOT load .env files automatically.
Loading .env files
Install and import dotenv:
npm install dotenvimport 'dotenv/config' // Must be first import
import { defineConfig, env } from 'prisma/config'Migrating from v6
Before (v6) - schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}After (v7) - prisma.config.ts
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
datasource: {
url: env('DATABASE_URL'),
directUrl: env('DIRECT_URL'),
},
})And update schema.prisma:
datasource db {
provider = "postgresql"
// URLs now in prisma.config.ts
}Custom Config Path
Use --config flag with CLI commands:
prisma migrate dev --config ./config/prisma.config.tsMonorepo Configuration
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
import path from 'path'
export default defineConfig({
schema: path.join(__dirname, 'packages/database/prisma/schema.prisma'),
migrations: {
path: path.join(__dirname, 'packages/database/prisma/migrations'),
},
datasource: {
url: env('DATABASE_URL'),
},
})Removed Features
Several features have been removed in Prisma v7. Here's how to migrate.
Client Middleware
Removed
// ❌ No longer works in v7
prisma.$use(async (params, next) => {
const before = Date.now()
const result = await next(params)
const after = Date.now()
console.log(`Query took ${after - before}ms`)
return result
})Use Client Extensions Instead
// ✅ v7 approach
const prisma = new PrismaClient({ adapter }).$extends({
query: {
$allModels: {
async $allOperations({ operation, model, args, query }) {
const before = Date.now()
const result = await query(args)
const after = Date.now()
console.log(`${model}.${operation} took ${after - before}ms`)
return result
},
},
},
})Common Middleware Patterns
Soft delete
const prisma = new PrismaClient({ adapter }).$extends({
query: {
user: {
async delete({ args, query }) {
// Convert delete to soft delete
return prisma.user.update({
where: args.where,
data: { deletedAt: new Date() },
})
},
async findMany({ args, query }) {
// Filter out soft-deleted records
args.where = { ...args.where, deletedAt: null }
return query(args)
},
},
},
})Logging
const prisma = new PrismaClient({ adapter }).$extends({
query: {
$allModels: {
async $allOperations({ operation, model, args, query }) {
console.log(`${model}.${operation}`, JSON.stringify(args))
return query(args)
},
},
},
})Metrics
Removed
The Metrics preview feature has been removed.
// ❌ No longer works
const metrics = await prisma.$metrics.json()Alternatives
Custom counter with extensions
let totalQueries = 0
const prisma = new PrismaClient({ adapter }).$extends({
client: {
async $totalQueries() {
return totalQueries
},
},
query: {
$allModels: {
async $allOperations({ query, args }) {
totalQueries += 1
return query(args)
},
},
},
})
// Usage
const count = await prisma.$totalQueries()Use driver-level metrics
Access metrics from the underlying driver adapter.
CLI Flags Removed
--skip-generate
Removed from migrate dev and db push.
# v6
prisma migrate dev --skip-generate
# v7 - generate is not run automatically
prisma migrate dev
prisma generate # Run explicitly if neededVerification against Prisma 7.8.0 showed no generated client files emitted by migrate dev or db push, even though some CLI help text still says migrate dev "trigger[s] generators".
--skip-seed
Removed from migrate dev. More importantly, Prisma v7 no longer auto-runs seeds during migrate dev or migrate reset, so seed explicitly when you need it.
# v6
prisma migrate dev --skip-seed
# v7 - seed is not run automatically
prisma migrate dev
prisma db seed # Run explicitly if needed--schema and --url from db execute
# v6
prisma db execute --file ./script.sql --url "$DATABASE_URL"
# v7 - configure in prisma.config.ts
prisma db execute --file ./script.sqlmigrate diff Options
| Removed | Replacement |
|---|---|
--from-url | --from-config-datasource |
--to-url | --to-config-datasource |
--from-schema-datasource | --from-config-datasource |
--to-schema-datasource | --to-config-datasource |
--shadow-database-url | Configure in prisma.config.ts |
Example
# v6
prisma migrate diff --from-url "$DATABASE_URL" --to-schema schema.prisma
# v7
prisma migrate diff --from-config-datasource --to-schema schema.prismaAutomatic Behaviors Removed
Auto-generate after migrate
# v7 workflow
prisma migrate dev --name add_field
prisma generate # Must run explicitlyAuto-seed after migrate
# v7 workflow
prisma migrate reset --force
prisma db seed # Must run explicitlyPrisma.validator
The prisma-client generator no longer exposes Prisma.validator. Use TypeScript's satisfies operator instead.
import { Prisma } from '../generated/prisma/client'
const userSelect = {
id: true,
email: true,
} satisfies Prisma.UserSelectrejectOnNotFound
Removed in v5.0.0 (already deprecated).
// ❌ Removed
const prisma = new PrismaClient({
rejectOnNotFound: true,
})
// ✅ Use OrThrow methods
const user = await prisma.user.findUniqueOrThrow({
where: { id: 1 },
})
const user = await prisma.user.findFirstOrThrow({
where: { email: 'test@example.com' },
})Schema Changes
Prisma v7 promotes prisma-client to the default generator. Update your generator block, output path, and imports accordingly.
This guide is for projects that are actually migrating to Prisma 7. Do not apply these schema changes to MongoDB projects; keep those on Prisma 6.x.
Generator Block (v7)
generator client {
provider = "prisma-client"
output = "../generated/prisma"
}Key Changes
1. Provider name
Use prisma-client in Prisma v7. The older prisma-client-js generator still exists in the repo for legacy setups, but prisma-client is the default path for current projects.
2. Output is required
The output field is mandatory when using prisma-client. Prisma Client no longer generates to node_modules with this generator.
generator client {
provider = "prisma-client"
output = "../generated/prisma"
}3. engineType changed
Legacy Rust engine settings are gone. With prisma-client, the relevant value is engineType = "client" if you want to state it explicitly, although it is typically inferred and can be omitted.
generator client {
provider = "prisma-client"
output = "../generated/prisma"
engineType = "client"
}4. moduleFormat is explicit when needed
If you must stay on CommonJS:
generator client {
provider = "prisma-client"
output = "../generated/prisma"
moduleFormat = "cjs"
}Example Output Paths
Standard project
output = "../generated/prisma"Creates files like:
generated/prisma/
client.ts
browser.ts
enums.ts
models.ts
models/Monorepo
output = "../../packages/database/generated/prisma"Same directory as schema
output = "./generated/prisma"Creates: prisma/generated/prisma/client.ts
Datasource Block
The url, directUrl, and shadowDatabaseUrl fields in the datasource block are deprecated in Prisma v7. Move them to prisma.config.ts and keep only the provider in schema.prisma:
datasource db {
provider = "postgresql"
}export default defineConfig({
datasource: {
url: env('DATABASE_URL'),
directUrl: env('DIRECT_URL'),
shadowDatabaseUrl: env('SHADOW_DATABASE_URL'),
},
})After Schema Changes
1. Run prisma generate:
npx prisma generate2. Update imports throughout your codebase:
import { PrismaClient } from '../generated/prisma/client'3. Update .gitignore if you manage this manually:
/generated/prisma4. Replace Prisma.validator() with TypeScript satisfies when using prisma-client:
import { Prisma } from '../generated/prisma/client'
const userSelect = {
id: true,
email: true,
} satisfies Prisma.UserSelectGenerated Entrypoints
client- server-side Prisma Client and Prisma namespacebrowser- browser-safe types and enums without a realPrismaClientenums- slim enum-only entrypointmodels- model types and derived helper types
Preview Features
Preview features still work as before:
generator client {
provider = "prisma-client"
output = "../generated/prisma"
previewFeatures = ["relationJoins", "fullTextSearch"]
}Recent preview-feature examples also include partialIndexes for PostgreSQL, SQLite, SQL Server, and CockroachDB:
generator client {
provider = "prisma-client"
output = "../generated/prisma"
previewFeatures = ["partialIndexes"]
}Related skills
FAQ
What does prisma-upgrade-v7 do?
prisma-upgrade-v7 is a Claude Code skill for ai & agent building. It helps developers move faster with AI-assisted coding.
When should I use prisma-upgrade-v7?
When you need to helps with ai & agent building tasks during ai-assisted development, or when prisma-upgrade-v7 is a claude code skill for ai & agent building. it helps developers move faster with ai-assisted coding.
What are the main capabilities?
prisma-upgrade-v7; AI & Agent Building; AI-coding skill.