Prisma 6 Migration Guide
This skill guides you through upgrading from Prisma 5 to Prisma 6, handling all breaking changes systematically to prevent runtime failures and type errors.
<role> This skill teaches Claude how to migrate Prisma 5 codebases to Prisma 6 following the official migration guide, addressing breaking changes in Buffer API, implicit many-to-many relationships, error handling, and reserved keywords. </role> <when-to-activate> This skill activates when: - User mentions "Prisma 6", "upgrade Prisma", "migrate to Prisma 6" - Encountering Prisma 6 type errors related to Bytes fields - Working with Prisma migrations or schema changes during upgrades - User reports NotFoundError issues after upgrading - Reserved keyword conflicts appear (`async`, `await`, `using`) </when-to-activate> <overview> Prisma 6 introduces four critical breaking changes that require code updates:
- •Buffer → Uint8Array: Bytes fields now use Uint8Array instead of Buffer
- •Implicit m-n PKs: Many-to-many join tables now use compound primary keys
- •NotFoundError → P2025: Error class removed, use error code checking
- •Reserved Keywords:
async,await,usingare now reserved model/field names
Attempting to use Prisma 6 without these updates causes type errors, runtime failures, and migration issues. </overview>
<workflow> ## Migration WorkflowPhase 1: Pre-Migration Assessment
- •
Identify all Bytes fields in schema
- •Use Grep to find
@db.ByteA,Bytesfield types - •List all files using Buffer operations on Bytes fields
- •Use Grep to find
- •
Find implicit many-to-many relationships
- •Search schema for relation fields without explicit join tables
- •Identify models with
@relationwithoutrelationName
- •
Locate NotFoundError usage
- •Grep for
NotFoundErrorimports and usage - •Find error handling that checks error class
- •Grep for
- •
Check for reserved keywords
- •Search schema for models/fields named
async,await,using
- •Search schema for models/fields named
Phase 2: Schema Migration
- •
Update reserved keywords in schema
- •Rename any models/fields using reserved words
- •Update all references in application code
- •
Generate migration for implicit m-n changes
- •Run
npx prisma migrate dev --name v6-implicit-mn-pks - •Review generated SQL for compound primary key changes
- •Run
Phase 3: Code Migration
- •
Update Buffer → Uint8Array conversions
- •Replace
Buffer.from()with TextEncoder - •Replace
.toString()with TextDecoder - •Update type annotations from Buffer to Uint8Array
- •Replace
- •
Update NotFoundError handling
- •Replace error class checks with P2025 code checks
- •Use
isPrismaClientKnownRequestErrortype guard
- •
Test all changes
- •Run existing tests
- •Verify Bytes field operations
- •Confirm error handling works correctly
Phase 4: Validation
- •
Run TypeScript compiler
- •Verify no type errors remain
- •Check all Buffer references resolved
- •
Run database migrations
- •Apply migrations to test database
- •Verify compound PKs created correctly
- •
Runtime testing
- •Test Bytes field read/write operations
- •Verify error handling catches not-found cases
- •Confirm implicit m-n queries work </workflow>
Quick Reference
Breaking Changes Summary:
| Change | Before | After |
|---|---|---|
| Buffer API | Buffer.from(), .toString() | TextEncoder, TextDecoder |
| Error Handling | error instanceof NotFoundError | error.code === 'P2025' |
| Implicit m-n PK | Auto-increment id | Compound PK (A, B) |
| Reserved Words | async, await, using allowed | Must use @map() |
Migration Command:
npx prisma migrate dev --name v6-upgrade
Validation Commands:
npx tsc --noEmit npx prisma migrate status npm test
MUST:
- •Backup production database before migration
- •Test migration in development/staging first
- •Review auto-generated migration SQL
- •Update all Buffer operations to TextEncoder/TextDecoder
- •Replace all NotFoundError checks with P2025 code checks
- •Run TypeScript compiler to verify no type errors
SHOULD:
- •Create helper functions for common error checks
- •Use
@map()when renaming reserved keywords - •Document breaking changes in commit messages
- •Update team documentation about Prisma 6 patterns
NEVER:
- •Run migrations directly in production without testing
- •Skip TypeScript compilation check
- •Leave Buffer references in code (causes type errors)
- •Use NotFoundError (removed in Prisma 6)
- •Use
async,await,usingas model/field names without@map()</constraints>
After completing migration:
- •
TypeScript Compilation:
- •Run:
npx tsc --noEmit - •Expected: Zero type errors
- •If fails: Check remaining Buffer references, NotFoundError usage
- •Run:
- •
Database Migration Status:
- •Run:
npx prisma migrate status - •Expected: All migrations applied
- •If fails: Apply pending migrations with
npx prisma migrate deploy
- •Run:
- •
Runtime Testing:
- •Test Bytes field write/read cycle
- •Verify error handling catches P2025 correctly
- •Test implicit m-n relationship queries
- •Confirm no runtime errors in production-like environment
- •
Performance Check:
- •Verify query performance unchanged
- •Check connection pool behavior
- •Monitor error rates in logs
- •
Rollback Readiness:
- •Document rollback steps
- •Keep Prisma 5 migration snapshot
- •Test rollback procedure in staging </validation>
References
For detailed migration guides and examples:
- •Breaking Changes Details: See
references/breaking-changes.mdfor complete API migration patterns, SQL examples, and edge cases - •Migration Examples: See
references/migration-examples.mdfor real-world migration scenarios with before/after code - •Migration Checklist: See
references/migration-checklist.mdfor step-by-step migration tasks - •Troubleshooting Guide: See
references/troubleshooting.mdfor common migration issues and solutions
For framework-specific migration patterns:
- •Next.js Integration: Consult Next.js plugin for App Router-specific Prisma 6 patterns
- •Serverless Deployment: See CLIENT-serverless-config skill for Prisma 6 + Lambda/Vercel
For error handling patterns:
- •Error Code Reference: See TRANSACTIONS-error-handling skill for comprehensive P-code handling