# Prisma 项目的 Claude Code 规则

> 适用于 Prisma ORM 项目的 Claude Code 规则，涵盖迁移安全性、查询模式、关联加载以及防止智能体破坏模式。

**Type:** Rule  
**Tools:** Claude Code, Cursor, Codex  
**Stack:** Next.js, PostgreSQL, TypeScript  
**Updated:** 2026-06-08

---

将此文件作为 `CLAUDE.md` 添加到你的仓库根目录。Claude Code 会自动读取 `CLAUDE.md`（以及 `AGENTS.md`），并将其作为项目级别指令应用于每个会话。

## Claude Code 规则文件

```txt title="Claude Code Rules"
# Prisma Project Rules

## Schema rules — highest risk area
- NEVER edit `prisma/schema.prisma` without explicitly confirming the change with the
  developer first. Schema changes generate migrations that alter production data.
- When asked to add a field, propose the schema diff and the migration name, then
  STOP and wait for approval before running `prisma migrate dev`.
- New required fields MUST have a `@default(...)` value or be added as optional
  (`String?`). Adding a required field without a default breaks `migrate deploy` on
  a non-empty database.
- Do NOT add `@@map` or `@map` attributes to rename existing tables or columns without
  explicitly discussing the migration strategy — renames require data migration steps.
- Use `@db.Text` for long strings, `@db.VarChar(n)` for bounded strings. Never use
  bare `String` for fields that will store user-generated content longer than 255 chars.

## Migration rules
- Run `prisma migrate dev --name <descriptive-name>` to generate migrations locally.
  Never hand-edit files in `prisma/migrations/` — they are append-only.
- In CI/CD, run `prisma migrate deploy` (not `migrate dev`). Never run `migrate dev`
  against a production database.
- After adding or changing models, always regenerate the client: `prisma generate`.
  Never commit code that imports from `@prisma/client` without a matching `generate` run.

## Query patterns
- Import the Prisma client from `src/lib/prisma.ts` (the singleton). Never instantiate
  `new PrismaClient()` in application code — this leaks connections in serverless.
- Use `select` or `include` explicitly on every query. Never rely on Prisma's default
  select-all behaviour — it causes over-fetching and leaks sensitive fields.
- Paginate all list queries with `take` and `skip` (or cursor-based pagination with
  `cursor` + `take`). Never run a `findMany` without a limit on a user-facing endpoint.
- Wrap multi-step mutations in `prisma.$transaction([...])` or the interactive
  transaction callback. Never perform two sequential writes that must be atomic outside
  a transaction.
- Use `prisma.$queryRaw` and `Prisma.sql` template tag for raw SQL only. Never
  concatenate user input into a raw query string — this is a SQL injection vector.

## Relation loading
- Prefer `include` over N+1 patterns. If a resolver loads a relation in a loop,
  refactor to a single query with `include` or use a DataLoader.
- Do not `include` deeply nested relations more than 2 levels deep in a single query.
  Flatten with multiple targeted queries and join in application code if needed.

## Type safety
- All repository functions must return typed Prisma result types or mapped domain types.
  Never return `any` or plain `object` from a database function.
- Use `Prisma.validator()` to define reusable select/include shapes that keep return
  types precise.

## Definition of done
- `prisma validate` passes.
- `tsc --noEmit` passes.
- No `new PrismaClient()` outside `src/lib/prisma.ts`.
- No `findMany` calls without `take`.
- Migration files are committed alongside schema changes.
```

## 为什么需要这些规则

- **未经确认不得编辑模式** 是不可商量的。Prisma 迁移在生产环境中不可逆——在没有数据迁移计划的情况下删除列或重命名表会导致数据丢失。那些“乐于助人”的智能体一旦接触模式就会愉快地运行 `migrate dev`。
- **单例客户端导入** 防止了最常见的无服务器陷阱之一：连接池耗尽。在 Next.js 无服务器函数中，除非使用单例模式，否则每次模块求值都会创建一个新的 `PrismaClient` 实例（以及新的连接池）。那些从 Prisma 文档复制示例的智能体通常会跳过这一点。

## 适用场景

- 使用 Prisma 与 PostgreSQL 的 Next.js 或 Node.js 应用，且模式成熟、迁移安全性至关重要。

## 不适用场景

- 尚无数据的全新项目，你希望智能体能自由迭代模式——在此阶段放宽迁移审批要求。