prisma-expert by sickn33/antigravity-awesome-skills
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill prisma-expert您是一位 Prisma ORM 专家,在模式设计、迁移、查询优化、关系建模以及跨 PostgreSQL、MySQL 和 SQLite 的数据库操作方面拥有深厚的知识。
如果问题具体涉及:
# 检查 Prisma 版本
npx prisma --version 2>/dev/null || echo "Prisma not installed"
# 检查数据库提供者
grep "provider" prisma/schema.prisma 2>/dev/null | head -1
# 检查现有迁移
ls -la prisma/migrations/ 2>/dev/null | head -5
# 检查 Prisma Client 生成状态
ls -la node_modules/.prisma/client/ 2>/dev/null | head -3
常见问题:
诊断:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
# 验证模式
npx prisma validate
# 检查模式漂移
npx prisma migrate diff --from-schema-datamodel prisma/schema.prisma --to-schema-datasource prisma/schema.prisma
# 格式化模式
npx prisma format
优先级修复:
@relation 指令@@index 添加适当的索引,优化字段类型最佳实践:
// 良好:具有清晰命名的显式关系
model 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")
}
资源:
常见问题:
诊断:
# 检查迁移状态
npx prisma migrate status
# 查看待处理的迁移
ls -la prisma/migrations/
# 检查迁移历史表
# (使用特定于数据库的命令)
优先级修复:
prisma migrate reset 重置开发数据库prisma migrate resolve安全的迁移工作流:
# 开发环境
npx prisma migrate dev --name descriptive_name
# 生产环境(切勿使用 migrate dev!)
npx prisma migrate deploy
# 如果迁移在生产环境失败
npx prisma migrate resolve --applied "migration_name"
# 或
npx prisma migrate resolve --rolled-back "migration_name"
资源:
常见问题:
诊断:
# 启用查询日志记录
# 在 schema.prisma 或客户端初始化中:
# log: ['query', 'info', 'warn', 'error']
// 启用查询事件
const prisma = new PrismaClient({
log: [
{ emit: 'event', level: 'query' },
],
});
prisma.$on('query', (e) => {
console.log('Query: ' + e.query);
console.log('Duration: ' + e.duration + 'ms');
});
优先级修复:
优化查询模式:
// 不好:N+1 问题
const users = await prisma.user.findMany();
for (const user of users) {
const posts = await prisma.post.findMany({ where: { authorId: user.id } });
}
// 良好:包含关系
const users = await prisma.user.findMany({
include: { posts: true }
});
// 更好:仅选择所需字段
const users = await prisma.user.findMany({
select: {
id: true,
email: true,
posts: {
select: { id: true, title: true }
}
}
});
// 复杂查询的最佳选择:使用 $queryRaw
const 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
`;
资源:
常见问题:
诊断:
# 检查当前连接数(PostgreSQL)
psql -c "SELECT count(*) FROM pg_stat_activity WHERE datname = 'your_db';"
优先级修复:
连接配置:
// 适用于无服务器环境(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;
// 优雅关闭
process.on('beforeExit', async () => {
await prisma.$disconnect();
});
# 带有连接池设置的连接 URL
DATABASE_URL="postgresql://user:pass@host:5432/db?connection_limit=5&pool_timeout=10"
资源:
常见问题:
诊断:
// 检查事务问题
try {
const result = await prisma.$transaction([...]);
} catch (e) {
if (e.code === 'P2034') {
console.log('检测到事务冲突');
}
}
事务模式:
// 顺序操作(自动事务)
const [user, profile] = await prisma.$transaction([
prisma.user.create({ data: userData }),
prisma.profile.create({ data: profileData }),
]);
// 具有手动控制的交互式事务
const result = await prisma.$transaction(async (tx) => {
const user = await tx.user.create({ data: userData });
// 业务逻辑验证
if (user.email.endsWith('@blocked.com')) {
throw new Error('邮箱域名被阻止');
}
const profile = await tx.profile.create({
data: { ...profileData, userId: user.id }
});
return { user, profile };
}, {
maxWait: 5000, // 等待事务槽位
timeout: 10000, // 事务超时
isolationLevel: 'Serializable', // 最严格的隔离级别
});
// 乐观并发控制
const updateWithVersion = await prisma.post.update({
where: {
id: postId,
version: currentVersion // 仅在版本匹配时更新
},
data: {
content: newContent,
version: { increment: 1 }
}
});
资源:
@id 和主键fields 和 references 的显式 @relationonDelete, onUpdate)@@map 进行表命名约定select 仅获取所需字段migrate dev此技能适用于执行概述中描述的工作流或操作。
每周安装量
2.8K
仓库
GitHub 星标数
27.4K
首次出现
Jan 20, 2026
安全审计
安装于
opencode2.1K
gemini-cli2.0K
codex2.0K
github-copilot1.9K
cursor1.9K
amp1.7K
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.
If the issue is specifically about:
# Check Prisma version
npx prisma --version 2>/dev/null || echo "Prisma not installed"
# Check database provider
grep "provider" prisma/schema.prisma 2>/dev/null | head -1
# Check for existing migrations
ls -la prisma/migrations/ 2>/dev/null | head -5
# Check Prisma Client generation status
ls -la node_modules/.prisma/client/ 2>/dev/null | head -3
Common Issues:
Diagnosis:
# Validate schema
npx prisma validate
# Check for schema drift
npx prisma migrate diff --from-schema-datamodel prisma/schema.prisma --to-schema-datasource prisma/schema.prisma
# Format schema
npx prisma format
Prioritized Fixes:
@relation directives@@index, optimize field typesBest Practices:
// Good: Explicit relations with clear naming
model 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:
Common Issues:
Diagnosis:
# Check migration status
npx prisma migrate status
# View pending migrations
ls -la prisma/migrations/
# Check migration history table
# (use database-specific command)
Prioritized Fixes:
prisma migrate resetprisma migrate resolveSafe Migration Workflow:
# Development
npx prisma migrate dev --name descriptive_name
# Production (never use migrate dev!)
npx prisma migrate deploy
# If migration fails in production
npx prisma migrate resolve --applied "migration_name"
# or
npx prisma migrate resolve --rolled-back "migration_name"
Resources:
Common Issues:
Diagnosis:
# Enable query logging
# In schema.prisma or client initialization:
# log: ['query', 'info', 'warn', 'error']
// Enable query events
const 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:
Optimized Query Patterns:
// BAD: N+1 problem
const users = await prisma.user.findMany();
for (const user of users) {
const posts = await prisma.post.findMany({ where: { authorId: user.id } });
}
// GOOD: Include relations
const users = await prisma.user.findMany({
include: { posts: true }
});
// BETTER: Select only needed fields
const users = await prisma.user.findMany({
select: {
id: true,
email: true,
posts: {
select: { id: true, title: true }
}
}
});
// BEST for complex queries: Use $queryRaw
const 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:
Common Issues:
Diagnosis:
# Check current connections (PostgreSQL)
psql -c "SELECT count(*) FROM pg_stat_activity WHERE datname = 'your_db';"
Prioritized Fixes:
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 shutdown
process.on('beforeExit', async () => {
await prisma.$disconnect();
});
# Connection URL with pool settings
DATABASE_URL="postgresql://user:pass@host:5432/db?connection_limit=5&pool_timeout=10"
Resources:
Common Issues:
Diagnosis:
// Check for transaction issues
try {
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 control
const 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 control
const updateWithVersion = await prisma.post.update({
where: {
id: postId,
version: currentVersion // Only update if version matches
},
data: {
content: newContent,
version: { increment: 1 }
}
});
Resources:
@id and primary keys@relation with fields and referencesonDelete, onUpdate)@@map used for table naming conventionsselect used to fetch only required fieldsmigrate dev in productionThis skill is applicable to execute the workflow or actions described in the overview.
Weekly Installs
2.8K
Repository
GitHub Stars
27.4K
First Seen
Jan 20, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode2.1K
gemini-cli2.0K
codex2.0K
github-copilot1.9K
cursor1.9K
amp1.7K
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
102,200 周安装