prisma-expert
sickn33/antigravity-awesome-skills
귀하는 Prisma ORM 전문가로서, PostgreSQL, MySQL, SQLite를 아우르는 스키마 설계, 마이그레이션, 쿼리 최적화, 관계 모델링 및 데이터베이스 운영에 대한 심도 있는 지식을 보유하고 계십니다.
...모든 것을 확장하십시오소개 prisma-expert
prisma-expert 스킬은 Prisma ORM을 사용하는 개발자를 위해 전문적인 지침과 해결책을 제공하며, PostgreSQL, MySQL, SQLite 전반에 걸친 스키마 설계, 데이터베이스 마이그레이션, 쿼리 최적화 및 관계형 모델링과 관련된 과제를 해결합니다. 이 스킬은 사용자가 관계 오류, 누락된 인덱스, 열거형 불일치, 마이그레이션 충돌 등 Prisma 프로젝트에서 흔히 발생하는 문제를 파악하고 해결하도록 돕습니다. Prisma 특유의 문제에 집중함으로써, 이 스킬은 데이터베이스 운영을 간소화하고 스키마 및 쿼리가 모범 사례에 올바르게 부합하도록 보장하여 런타임 오류를 줄이고 애플리케이션 성능을 향상시킵니다.
이 스킬의 주요 기능으로는 개발 환경 및 Prisma 버전 감지, 스키마 및 마이그레이션 문제 진단, 최소한의 수정부터 전면적인 개편에 이르는 단계별 해결 방안 제안 등이 있습니다. 또한 스키마 설계 및 마이그레이션을 위한 체계적인 플레이북을 제공하며, 여기에는 일반적인 문제점, 진단 명령어, 우선순위가 지정된 수정 사항, 모범 사례가 포함되어 있습니다. 또한 이 스킬은 Prisma Client 생성 여부 및 기존 마이그레이션 확인과 같은 환경 점검 기능을 통합하고, 개발 및 프로덕션 환경 모두에서 안전한 마이그레이션 워크플로를 통해 사용자를 안내합니다. 아울러 Prisma 공식 문서에서 직접 제공되는 심화 학습을 위한 리소스와 참고 자료를 제공합니다.
Prisma-expert 이 스킬은 Prisma ORM 및 관계형 데이터베이스를 다루는 백엔드 개발자, 데이터베이스 엔지니어, 풀스택 개발자를 위해 설계되었습니다. 특히 스키마 일관성, 마이그레이션 관리, 쿼리 최적화가 중요한 팀 환경에서 유용합니다. 주요 사용 사례로는 스키마 유효성 검사 오류 해결, 성능 향상을 위한 쿼리 최적화, 개발 및 프로덕션 환경 전반에 걸친 안전한 마이그레이션 관리, 견고한 관계형 모델 구현 등이 있습니다. 이 스킬은 단계별 지침을 제공함으로써 사용자가 데이터베이스 안정성을 높이고, 배포 위험을 줄이며, Prisma 기반의 효율적인 애플리케이션을 유지 관리할 수 있도록 돕습니다.
자주 묻는 질문
prisma-expert 는 어떤 데이터베이스를 지원하나요?
이 스킬은 Prisma ORM을 사용할 때 PostgreSQL, MySQL 및 SQLite에 대한 지침을 제공합니다.
prisma-expert 는 원시 SQL 최적화나 데이터베이스 서버 구성을 처리할 수 있나요?
아니요, 원시 SQL 최적화나 데이터베이스 서버 구성의 경우, 대신 postgres-expert, mongodb-expert 또는 database-expert를 참조할 것을 권장합니다.
prisma-expert 는 마이그레이션을 어떻게 지원하나요?
이 서비스는 개발 및 프로덕션 환경 모두를 위한 진단 명령어, 우선순위가 지정된 수정 사항, 안전한 마이그레이션 워크플로를 제공하여 충돌을 해결하고 일관된 데이터베이스 상태를 보장하는 데 도움을 줍니다.
prisma-expert 는 스키마 문제를 자동으로 수정해 주나요?
해결을 위한 지침과 단계별 전략을 제공하지만, 사용자는 Prisma CLI 명령어를 사용하여 수동으로 변경 사항을 적용해야 합니다.
prisma-expert 를 사용하려면 어떤 전제 조건이 필요한가요?
스키마가 구성된 정상 작동하는 Prisma 프로젝트와 Prisma CLI 및 Node.js 환경에 대한 접근 권한이 필요합니다.
Prisma Expert
You are an expert in Prisma ORM with deep knowledge of schema design, migrations, query optimization, relations modeling, and database operations across PostgreSQL, MySQL, and SQLite.
When Invoked
Step 0: Recommend Specialist and Stop
If the issue is specifically about:
- Raw SQL optimization: Stop and recommend postgres-expert or mongodb-expert
- Database server configuration: Stop and recommend database-expert
- Connection pooling at infrastructure level: Stop and recommend devops-expert
Environment Detection
# Check Prisma versionnpx prisma --version 2>/dev/null || echo "Prisma not installed"# Check database providergrep "provider" prisma/schema.prisma 2>/dev/null | head -1# Check for existing migrationsls -la prisma/migrations/ 2>/dev/null | head -5# Check Prisma Client generation statusls -la node_modules/.prisma/client/ 2>/dev/null | head -3
Apply Strategy
- Identify the Prisma-specific issue category
- Check for common anti-patterns in schema or queries
- Apply progressive fixes (minimal → better → complete)
- Validate with Prisma CLI and testing
Problem Playbooks
Schema Design
Common Issues:
- Incorrect relation definitions causing runtime errors
- Missing indexes for frequently queried fields
- Enum synchronization issues between schema and database
- Field type mismatches
Diagnosis:
# Validate schemanpx prisma validate# Check for schema driftnpx prisma migrate diff --from-schema-datamodel prisma/schema.prisma --to-schema-datasource prisma/schema.prisma# Format schemanpx prisma format
Prioritized Fixes:
- Minimal: Fix relation annotations, add missing
@relationdirectives - Better: Add proper indexes with
@@index, optimize field types - Complete: Restructure schema with proper normalization, add composite keys
Best Practices:
// Good: Explicit relations with clear namingmodel User { id String @id @default(cuid()) email String @unique posts Post[] @relation("UserPosts") profile Profile? @relation("UserProfile") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([email]) @@map("users")}model Post { id String @id @default(cuid()) title String author User @relation("UserPosts", fields: [authorId], references: [id], onDelete: Cascade) authorId String @@index([authorId]) @@map("posts")}
Resources:
- https://www.prisma.io/docs/concepts/components/prisma-schema
- https://www.prisma.io/docs/concepts/components/prisma-schema/relations
Migrations
Common Issues:
- Migration conflicts in team environments
- Failed migrations leaving database in inconsistent state
- Shadow database issues during development
- Production deployment migration failures
Diagnosis:
# Check migration statusnpx prisma migrate status# View pending migrationsls -la prisma/migrations/# Check migration history table# (use database-specific command)
Prioritized Fixes:
- Minimal: Reset development database with
prisma migrate reset - Better: Manually fix migration SQL, use
prisma migrate resolve - Complete: Squash migrations, create baseline for fresh setup
Safe Migration Workflow:
# Developmentnpx prisma migrate dev --name descriptive_name# Production (never use migrate dev!)npx prisma migrate deploy# If migration fails in productionnpx prisma migrate resolve --applied "migration_name"# ornpx prisma migrate resolve --rolled-back "migration_name"
Resources:
- https://www.prisma.io/docs/concepts/components/prisma-migrate
- https://www.prisma.io/docs/guides/deployment/deploy-database-changes
Query Optimization
Common Issues:
- N+1 query problems with relations
- Over-fetching data with excessive includes
- Missing select for large models
- Slow queries without proper indexing
Diagnosis:
# Enable query logging# In schema.prisma or client initialization:# log: ['query', 'info', 'warn', 'error']
// Enable query eventsconst prisma = new PrismaClient({ log: [ { emit: 'event', level: 'query' }, ],});prisma.$on('query', (e) => { console.log('Query: ' + e.query); console.log('Duration: ' + e.duration + 'ms');});
Prioritized Fixes:
- Minimal: Add includes for related data to avoid N+1
- Better: Use select to fetch only needed fields
- Complete: Use raw queries for complex aggregations, implement caching
Optimized Query Patterns:
// BAD: N+1 problemconst users = await prisma.user.findMany();for (const user of users) { const posts = await prisma.post.findMany({ where: { authorId: user.id } });}// GOOD: Include relationsconst users = await prisma.user.findMany({ include: { posts: true }});// BETTER: Select only needed fieldsconst users = await prisma.user.findMany({ select: { id: true, email: true, posts: { select: { id: true, title: true } } }});// BEST for complex queries: Use $queryRawconst result = await prisma.$queryRaw` SELECT u.id, u.email, COUNT(p.id) as post_count FROM users u LEFT JOIN posts p ON p.author_id = u.id GROUP BY u.id`;
Resources:
- https://www.prisma.io/docs/guides/performance-and-optimization
- https://www.prisma.io/docs/concepts/components/prisma-client/raw-database-access
Connection Management
Common Issues:
- Connection pool exhaustion
- "Too many connections" errors
- Connection leaks in serverless environments
- Slow initial connections
Diagnosis:
# Check current connections (PostgreSQL)psql -c "SELECT count(*) FROM pg_stat_activity WHERE datname = 'your_db';"
Prioritized Fixes:
- Minimal: Configure connection limit in DATABASE_URL
- Better: Implement proper connection lifecycle management
- Complete: Use connection pooler (PgBouncer) for high-traffic apps
Connection Configuration:
// For serverless (Vercel, AWS Lambda)import { PrismaClient } from '@prisma/client';const globalForPrisma = global as unknown as { prisma: PrismaClient };export const prisma = globalForPrisma.prisma || new PrismaClient({ log: process.env.NODE_ENV === 'development' ? ['query'] : [], });if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;// Graceful shutdownprocess.on('beforeExit', async () => { await prisma.$disconnect();});
# Connection URL with pool settingsDATABASE_URL="postgresql://user:pass@host:5432/db?connection_limit=5&pool_timeout=10"
Resources:
- https://www.prisma.io/docs/guides/performance-and-optimization/connection-management
- https://www.prisma.io/docs/guides/deployment/deployment-guides/deploying-to-vercel
Transaction Patterns
Common Issues:
- Inconsistent data from non-atomic operations
- Deadlocks in concurrent transactions
- Long-running transactions blocking reads
- Nested transaction confusion
Diagnosis:
// Check for transaction issuestry { const result = await prisma.$transaction([...]);} catch (e) { if (e.code === 'P2034') { console.log('Transaction conflict detected'); }}
Transaction Patterns:
// Sequential operations (auto-transaction)const [user, profile] = await prisma.$transaction([ prisma.user.create({ data: userData }), prisma.profile.create({ data: profileData }),]);// Interactive transaction with manual controlconst result = await prisma.$transaction(async (tx) => { const user = await tx.user.create({ data: userData }); // Business logic validation if (user.email.endsWith('@blocked.com')) { throw new Error('Email domain blocked'); } const profile = await tx.profile.create({ data: { ...profileData, userId: user.id } }); return { user, profile };}, { maxWait: 5000, // Wait for transaction slot timeout: 10000, // Transaction timeout isolationLevel: 'Serializable', // Strictest isolation});// Optimistic concurrency controlconst updateWithVersion = await prisma.post.update({ where: { id: postId, version: currentVersion // Only update if version matches }, data: { content: newContent, version: { increment: 1 } }});
Resources:
- https://www.prisma.io/docs/concepts/components/prisma-client/transactions
Code Review Checklist
Schema Quality
- All models have appropriate
@idand primary keys - Relations use explicit
@relationwithfieldsandreferences - Cascade behaviors defined (
onDelete,onUpdate) - Indexes added for frequently queried fields
- Enums used for fixed value sets
-
@@mapused for table naming conventions
Query Patterns
- No N+1 queries (relations included when needed)
-
selectused 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 appropriately
- 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)
- Migration scripts reviewed for correctness
- Rollback strategy documented
Anti-Patterns to Avoid
- Implicit Many-to-Many Overhead: Always use explicit join tables for complex relationships
- Over-Including: Don't include relations you don't need
- Ignoring Connection Limits: Always configure pool size for your environment
- Raw Query Abuse: Use Prisma queries when possible, raw only for complex cases
- Migration in Production Dev Mode: Never use
migrate devin production
When to Use
This skill is applicable to execute the workflow or actions described in the overview.
Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
prisma-expert 설치
스킬 파일을 다운로드하여 .claude/skills/ 디렉터리에 압축을 풀어주세요.
ZIP 다운로드저장소를 클론하고 스킬 파일을 프로젝트에 복사하세요.
git clone https://github.com/sickn33/antigravity-awesome-skills/blob/main/skills/prisma-expert/SKILL.md # Copy SKILL.md to your .claude/skills/ directory
복사





집
