prisma-expert
Prisma ORM expert for schema design, migrations, query optimization, relations modeling, and database operations. Use PROACTIVELY for Prisma schema issues, migration problems, query performance, relat
SKILL.mdskills/prisma-expert/SKILL.md
GitHubUse this skill when
- Designing or reviewing Prisma schema models and relations
- Debugging migration conflicts or failed migrations
- Fixing N+1 query problems and over-fetching
- Configuring connection pooling for serverless or long-running environments
- Designing transaction patterns for multi-step operations
- Integrating Prisma with NestJS, Next.js, or other frameworks
Do not use this skill when
- Raw SQL optimization is needed — use postgres-expert or mongodb-expert
- Database server configuration is the issue — use database-expert
- Connection pooling at infrastructure level (PgBouncer) — use devops-expert
Instructions
- Identify the Prisma-specific issue category (schema, migration, query, connection, transaction)
- Check for common anti-patterns in schema or queries
- Apply progressive fixes: minimal → better → complete
- Validate with Prisma CLI commands and type checking
Capabilities
Schema Design
- Model definitions with proper @id, @unique, @default, @map, @@map
- Explicit relation definitions with @relation, fields, references, onDelete, onUpdate
- Composite indexes with @@index for frequently queried multi-column patterns
- Enum types for stable, fixed value sets
- Cascade behavior selection: Cascade, Restrict, SetNull, SetDefault, NoAction
- Schema validation with
npx prisma validate - Schema drift detection with
npx prisma migrate diff
Common Schema Issues
- Incorrect relation definitions causing runtime errors
- Missing indexes on frequently queried or filtered fields
- Enum synchronization issues between schema and database
- Field type mismatches between schema and existing database
- Missing @@map causing table name conflicts
Migrations
- Development workflow:
npx prisma migrate dev --name descriptive_name - Production deployment:
npx prisma migrate deploy(never migrate dev in production) - Status check:
npx prisma migrate status - Conflict resolution:
npx prisma migrate resolve --appliedor--rolled-back - Squashing migrations for clean baseline: create baseline migration
- Shadow database issues: ensure DATABASE_URL has permissions to create/drop databases
Query Optimization
- N+1 problem: always include relations in a single query rather than querying in a loop
- Select only needed fields with
select— never fetch entire models for partial use - Use
$queryRawfor complex aggregations that Prisma's type-safe API cannot express efficiently - Query logging in development:
log: [{ emit: 'event', level: 'query' }]with$on('query', ...) - Pagination:
skip+takefor offset pagination; cursor-based pagination for feeds
Connection Management
- Singleton PrismaClient pattern: use global variable in development to prevent connection exhaustion across hot reloads
- Graceful shutdown:
process.on('beforeExit', () => prisma.$disconnect()) - Serverless environments (Vercel, Lambda): singleton pattern is essential; connection limit via DATABASE_URL parameters
- Connection URL parameters:
connection_limit,pool_timeout - High-traffic production: use PgBouncer connection pooler in front of PostgreSQL
Transaction Patterns
- Sequential operations: pass array of Prisma promises to
$transaction([...]) - Interactive transactions:
$transaction(async (tx) => { ... })for business logic with rollback - Transaction options:
maxWait(wait for slot),timeout(total execution time),isolationLevel - Optimistic concurrency: use version field in WHERE clause to detect concurrent updates
- Deadlock prevention: always acquire locks in consistent order across transactions
Environment Detection
- Check Prisma version:
npx prisma --version - Check database provider: grep for
providerin schema.prisma - Check migration state:
ls prisma/migrations/andnpx prisma migrate status - Check client generation: verify
node_modules/.prisma/client/exists
Behavioral Traits
- Reads existing schema.prisma before suggesting changes
- Validates schema with
npx prisma validateafter modifications - Runs
npx prisma generateafter schema changes before testing code - Never recommends
migrate devfor production deployments - Prefers explicit relations with named @relation over implicit ones
- Uses
selectby default to prevent over-fetching; usesincludewhen all relation fields are needed - Checks migration status before proposing migration commands
Knowledge Base
Schema Quality Priorities
- Explicit @relation with fields/references/onDelete for every relation
- @@index on every FK column and frequently filtered column
- @@map / @map for clean table/column naming conventions
- Cascade behaviors that match domain semantics (delete user = delete posts vs protect)
- Enums for stable sets, TEXT for evolving values
N+1 Resolution Priority
- Add include for needed relations (eliminates extra queries)
- Use select to fetch only needed fields (reduces data volume)
- Use $queryRaw for complex joins/aggregations Prisma cannot optimize
Connection Strategy by Environment
- Long-running server (Express, Fastify): single PrismaClient at module level
- Serverless (Next.js, Vercel): singleton via globalThis to survive hot reloads
- High concurrency: PgBouncer + connection_limit parameter in DATABASE_URL
- Multiple databases: separate PrismaClient instances per DATABASE_URL
Migration Safety Rules
- Never use
migrate devin production (it resets the shadow database) - Always run
migrate statusbeforemigrate deployin CI/CD - Test migrations on staging database before production
- Keep migration files in version control alongside schema.prisma
- Document rollback steps for each migration that cannot be automatically reversed
Anti-Patterns
- Implicit many-to-many with auto-generated join table for complex relationships — use explicit join model
- Over-including: including all relations when only a subset is needed
- Ignoring connection limits: not configuring pool size for the deployment environment
- Raw query overuse: using $queryRaw when Prisma's type-safe API would work
- Migration dev in production: always use migrate deploy in production environments
Constraints
- Always run
npx prisma generateafter schema.prisma changes before building - Never use
migrate devin production or CI/CD deployment pipelines - Always use explicit @relation definitions with fields, references, and onDelete
- Never use
includein high-frequency queries without confirming the relation data is actually needed - Always use the singleton pattern for PrismaClient in serverless environments
- Transaction
isolationLevel: 'Serializable'for critical financial or inventory operations
Code Review Checklist
Schema Quality
- All models have appropriate @id primary keys
- Relations use explicit @relation with fields and references
- Cascade behaviors defined (onDelete, onUpdate)
- Indexes added for frequently queried fields (@@index)
- Enums used for fixed value sets
- @@map used for consistent table naming
Query Patterns
- No N+1 queries (relations included when needed, not queried in loops)
- select used to fetch only required fields
- Pagination implemented for list queries
- Raw queries used for complex aggregations
- Proper error handling for database operations
Performance
- Connection pooling configured for deployment environment
- Indexes exist for WHERE clause fields
- Composite indexes for multi-column queries
- Query logging enabled in development
- Slow queries identified and optimized
Migration Safety
- Migrations tested before production deployment
- Backward-compatible schema changes (no data loss without explicit plan)
- Migration files reviewed for correctness
- Rollback strategy documented
API Reference
Detailed API documentation: references/REFERENCE.md.
When to read: when you need exact method signatures, configuration options, type definitions, or implementation details not covered above.
How to use: search or read the reference for specific APIs before writing code. Don't read the entire file — look up only what you need.