Prisma ORM best practices, schema design, migrations, seeding, and query optimization for PostgreSQL. Use when working with database schemas, migrations, or Prisma queries.
Install
npx skillscat add sabahattinkalkan/antigravity-fullstack-hq/prisma-workflow Install via the SkillsCat registry.
SKILL.md
Prisma Workflow
Schema Design
model User {
id String @id @default(cuid())
email String @unique
name String?
role Role @default(USER)
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([email])
}
model Post {
id String @id @default(cuid())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
authorId String
@@index([authorId])
}
enum Role {
USER
ADMIN
}Migration Workflow
- Edit
schema.prisma npx prisma migrate dev --name descriptive_name- Review generated SQL in
prisma/migrations/ - Test on development
npx prisma migrate deployfor production
Good Migration Names
npx prisma migrate dev --name add_user_role
npx prisma migrate dev --name create_posts_table
npx prisma migrate dev --name add_index_on_emailQuery Patterns
Select Specific Fields
const user = await prisma.user.findUnique({
where: { id },
select: { id: true, email: true, name: true }
})Include Relations
const user = await prisma.user.findUnique({
where: { id },
include: { posts: true }
})Pagination
const users = await prisma.user.findMany({
skip: (page - 1) * limit,
take: limit,
orderBy: { createdAt: 'desc' }
})Transactions
await prisma.$transaction([
prisma.user.update({ where: { id }, data: { balance: { decrement: 100 } } }),
prisma.order.create({ data: { userId: id, amount: 100 } })
])Performance Tips
- Always index foreign keys
- Use
selectto fetch only needed fields - Use
takefor large tables - Batch operations with
createMany - Use transactions for related operations
Prisma Service (NestJS)
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect()
}
}