agentleFS
nateslabachnateslabach/skills/skills/prisma/SKILL.md

prisma

Skill6 starsChanged 4 months agoMITView on GitHub

TypeScript and Prisma ORM best practices for schema design, type-safe queries, migrations, and error handling. Use when writing Prisma schemas, building database access layers, or debugging query performance in TypeScript projects.

  • Reads credentials

7 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use react.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • VercelSkill

    react

    React renderer for json-render that turns JSON specs into React components. Use when working with @json-render/react, building React UIs from JSON, creating component catalogs, or rendering AI-generated specs.

    Also in 3 projects that use this

The file

Show its rules and text

We split this skill into the rules it gives an agent

13 rules. 0 are common, 7 are distinctive, and 6 are very specific to this project.

  • 0

    Common

    Most of the 7 edited versions we read keep these.

  • 7

    Distinctive

    This author's own choices. Worth a look.

  • 6

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Enums vs client imports: Import from the generated enums.ts in client/shared code.

    line 13
  2. Distinctive:

    Repository pattern: Keep data access logic separate from business logic.

    line 14
  3. Distinctive:

    Never modify existing migrations: Treat migrations as append-only history.

    line 16
  4. Distinctive:

    Use domain-driven model names.

    line 60
  5. Distinctive:

    Use Prisma's native type decorators for database-level precision.

    line 63
  6. Very specific:

    N+1: Use nested include or select instead of looping with separate queries.

    line 67
  7. Very specific:

    Pagination: Use take and skip; add a cursor-based approach for large datasets.

    line 68
  8. Very specific:

    Field selection: Use select to fetch only needed fields.

    line 69
  9. Very specific:

    Use descriptive names: prisma migrate dev --name add_user_email_index.

    line 86
  10. Distinctive:

    Never edit existing migration files — create a new migration instead.

    line 88
  11. Distinctive:

    Keep migrations idempotent where possible.

    line 89
  12. Very specific:

    Do multi-record writes use $transaction?

    line 95
  13. Distinctive:

    Do migrations have descriptive names and remain unmodified after creation?

    line 98

“Common” is measured: kept by at least 6 in 10 of the 7 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

prisma

Ensures Prisma code is type-safe, performant, and architecturally clean — covering the non-obvious patterns that trip up even experienced developers.

Core Principles

  • One PrismaClient per process. Multiple instances create multiple connection pools and exhaust your database connection limit.
  • Enums vs client imports. Import from the generated enums.ts in client/shared code; import from client.ts only in server-side code. Never import client.ts in client components.
  • Repository pattern. Keep data access logic separate from business logic. Create repository modules for complex query sets.
  • Transactions for multi-step writes. Any operation that modifies more than one record should use $transaction.
  • Never modify existing migrations. Treat migrations as append-only history.

When to Use

  • Writing or reviewing Prisma schema models
  • Building or refactoring a database access layer
  • Debugging N+1 queries or performance regressions
  • Setting up Prisma in a new project (especially Next.js)

Implementation Guide

Client Setup (Singleton)

The hot-reload guard is required in Next.js — without it, dev mode creates a new PrismaClient on every file change and exhausts connections:

// lib/prisma.ts
import { PrismaClient } from "@prisma/client";

const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };

export const prisma =
  globalForPrisma.prisma ?? new PrismaClient();

if (process.env.NODE_ENV !== "production")
  globalForPrisma.prisma = prisma;

Enums vs Client Imports

// ✅ Client component or shared validation code
import { Role, Status } from "@prisma/client/enums";

// ✅ Server-side only (API routes, server components, background jobs)
import { prisma } from "@/lib/prisma";
import type { User } from "@prisma/client";

// ❌ Never in client components
import { PrismaClient } from "@prisma/client";

Schema Design

  • Use domain-driven model names. Keep schemas normalized and DRY.
  • Declare all relations explicitly with @relation.
  • Implement soft delete via deletedAt DateTime? — never hard-delete records that may be referenced.
  • Use Prisma's native type decorators for database-level precision.

Queries & Performance

  • N+1: Use nested include or select instead of looping with separate queries.
  • Pagination: Use take and skip; add a cursor-based approach for large datasets.
  • Field selection: Use select to fetch only needed fields; avoid over-fetching with blanket include.
  • Join strategy: relationLoadStrategy ("join" or "query") is available but requires enabling the relationJoins preview feature flag. "join" uses a single LATERAL JOIN; "query" sends one query per table and joins at the application level.

Error Handling

Catch Prisma-specific errors at the repository boundary:

  • PrismaClientKnownRequestError — structured DB errors. Check error.code:
    • P2002 — unique constraint violation
    • P2025 — record not found (replaces the removed NotFoundError from Prisma 5)
  • PrismaClientUnknownRequestError — unstructured DB errors
  • PrismaClientValidationError — invalid query shape (usually a type error)

Provide user-friendly messages upstream; log the full error with context for debugging.

Migrations

  • Use descriptive names: prisma migrate dev --name add_user_email_index.
  • Review generated SQL before applying to production.
  • Never edit existing migration files — create a new migration instead.
  • Keep migrations idempotent where possible.

Review Checklist

  • Is there a single PrismaClient instance with the hot-reload guard in place?
  • Are enums imported from enums.ts in any client or shared code?
  • Do multi-record writes use $transaction?
  • Are N+1 patterns avoided (no DB calls inside loops)?
  • Are PrismaClientKnownRequestError codes handled at the repository boundary?
  • Do migrations have descriptive names and remain unmodified after creation?

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.