# Prisma Workflow

> Prisma ORM best practices, schema design, migrations, seeding, and query optimization for PostgreSQL. Use when working with database schemas, migrations, or Prisma queries. Use when this capability is needed.

- Skill: `tomevault-io/prisma-workflow` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/prisma-workflow`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/prisma-workflow/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/prisma-workflow

---


# Prisma Workflow

## Schema Design

```prisma
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

1. Edit `schema.prisma`
2. `npx prisma migrate dev --name descriptive_name`
3. Review generated SQL in `prisma/migrations/`
4. Test on development
5. `npx prisma migrate deploy` for production

### Good Migration Names

```bash
npx prisma migrate dev --name add_user_role
npx prisma migrate dev --name create_posts_table
npx prisma migrate dev --name add_index_on_email
```

## Query Patterns

### Select Specific Fields

```typescript
const user = await prisma.user.findUnique({
  where: { id },
  select: { id: true, email: true, name: true }
})
```

### Include Relations

```typescript
const user = await prisma.user.findUnique({
  where: { id },
  include: { posts: true }
})
```

### Pagination

```typescript
const users = await prisma.user.findMany({
  skip: (page - 1) * limit,
  take: limit,
  orderBy: { createdAt: 'desc' }
})
```

### Transactions

```typescript
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 `select` to fetch only needed fields
- Use `take` for large tables
- Batch operations with `createMany`
- Use transactions for related operations

## Prisma Service (NestJS)

```typescript
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  async onModuleInit() {
    await this.$connect()
  }
}
```

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/sabahattinkalkan) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-11 -->

