You are an expert in Prisma, the TypeScript ORM with a declarative schema, auto-generated type-safe client, migrations, and studio GUI. You help developers model databases with Prisma Schema Language, generate a fully typed client that catches query errors at compile time, run zero-downtime migrations, and integrate with Postgres, MySQL, SQLite, MongoDB, CockroachDB, and PlanetScale.
Scanned 9/6/2026
Install to Claude Code
npx -y skills add TerminalSkills/skills --skill prisma --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Prisma?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/terminalskills-prisma)More formats (shields.io, HTML) on the badges page.
---
name: prisma
description: >-
You are an expert in Prisma, the TypeScript ORM with a declarative schema,
auto-generated type-safe client, migrations, and studio GUI. You help
developers model databases with Prisma Schema Language, generate a fully
typed client that catches query errors at compile time, run zero-downtime
migrations, and integrate with Postgres, MySQL, SQLite, MongoDB,
CockroachDB, and PlanetScale.
license: Apache-2.0
compatibility: ''
metadata:
author: terminal-skills
version: 1.0.0
category: Backend Development
tags:
- orm
- database
- typescript
- postgres
- mysql
- sqlite
- schema
- migrations
---
# Prisma — Next-Generation TypeScript ORM
You are an expert in Prisma, the TypeScript ORM with a declarative schema, auto-generated type-safe client, migrations, and studio GUI. You help developers model databases with Prisma Schema Language, generate a fully typed client that catches query errors at compile time, run zero-downtime migrations, and integrate with Postgres, MySQL, SQLite, MongoDB, CockroachDB, and PlanetScale.
## Core Capabilities
### Schema
```prisma
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
email String @unique
name String
role Role @default(USER)
posts Post[]
profile Profile?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([email])
@@map("users")
}
model Post {
id String @id @default(cuid())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId String
categories Category[]
createdAt DateTime @default(now())
@@index([authorId])
@@index([published, createdAt])
}
model Profile {
id String @id @default(cuid())
bio String?
avatar String?
user User @relation(fields: [userId], references: [id])
userId String @unique
}
model Category {
id String @id @default(cuid())
name String @unique
posts Post[]
}
enum Role {
USER
ADMIN
MODERATOR
}
```
### Queries
```typescript
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
// Create with relations
const user = await prisma.user.create({
data: {
name: "Alice",
email: "alice@example.com",
profile: { create: { bio: "Developer" } },
posts: {
create: [
{ title: "First Post", content: "Hello world", published: true },
{ title: "Draft", content: "Work in progress" },
],
},
},
include: { posts: true, profile: true },
});
// Complex queries — fully typed
const publishedPosts = await prisma.post.findMany({
where: {
published: true,
author: { role: "ADMIN" },
createdAt: { gte: new Date("2026-01-01") },
},
include: {
author: { select: { name: true, email: true } },
categories: true,
},
orderBy: { createdAt: "desc" },
take: 20,
skip: 0,
});
// Aggregate
const stats = await prisma.post.aggregate({
_count: true,
_avg: { createdAt: true },
where: { published: true },
});
// Transaction
const [updatedPost, newNotification] = await prisma.$transaction([
prisma.post.update({ where: { id: "..." }, data: { published: true } }),
prisma.notification.create({ data: { userId: "...", message: "Post published!" } }),
]);
// Raw SQL when needed
const result = await prisma.$queryRaw`
SELECT u.name, COUNT(p.id) as post_count
FROM users u LEFT JOIN posts p ON p."authorId" = u.id
GROUP BY u.name ORDER BY post_count DESC LIMIT 10
`;
```
### Migrations
```bash
npx prisma migrate dev --name add-categories # Create + apply migration
npx prisma migrate deploy # Apply in production
npx prisma db push # Push schema without migration (prototyping)
npx prisma studio # GUI for browsing data
npx prisma generate # Regenerate client after schema change
```
## Installation
```bash
npm install prisma @prisma/client
npx prisma init # Creates schema.prisma + .env
```
## Best Practices
1. **Type-safe queries** — Every query is fully typed; wrong field names or types caught at compile time
2. **Relations** — Define in schema with `@relation`; query with `include` or `select` for eager loading
3. **Migrations** — Use `prisma migrate dev` in development; `migrate deploy` in CI/production
4. **Indexes** — Add `@@index` for fields you filter/sort by; Prisma warns about missing indexes
5. **Select vs Include** — Use `select` to pick specific fields (smaller payloads); `include` for full relations
6. **Transactions** — Use `$transaction` for atomic multi-table operations; auto-rollback on failure
7. **Connection pooling** — Use `prisma-accelerate` or pgbouncer for serverless; Lambda needs pooling
8. **Prisma Studio** — `npx prisma studio` for visual data browser; great for debugging and manual edits
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!