mcpField
P
prisma-nestjs-patterns

prisma-nestjs-patterns

github.com/davidcastagnetoa开发1146 次安装34 周前更新
代码仓库

关于 prisma-nestjs-patterns

面向使用 NestJS 与 Prisma 的开发者,提供遵循 Clean Architecture 的集成指南。内容涵盖配置、仓储、事务、查询优化和测试,并按主题提供详细参考文件。

主要功能

  1. 01NestJS 中配置 Prisma
  2. 02Clean Architecture 仓储模式
  3. 03原子事务与并发处理
  4. 04查询优化与 N+1 防范
  5. 05单元及集成测试指导

适用场景

  1. 01在 NestJS 项目中接入 Prisma
  2. 02设计数据库模型并创建迁移
  3. 03处理预订等并发写入操作
  4. 04优化查询或为 Prisma 编写测试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/davidcastagnetoa/skills --skill prisma-nestjs-patterns

安装后在 Claude Code 中输入/prisma-nestjs-patterns确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
query-patterns.md
repository-pattern.md
schema-and-migrations.md
setup-and-service.md
testing.md
transactions.md

详细介绍

Prisma ORM + NestJS — 生产模式

遵循 Clean Architecture 的 Prisma 与 NestJS 完整集成指南。涵盖从基础配置到关键原子事务、仓库、查询优化和测试的内容。

可用参考资料

需要深入了解特定领域时,请阅读相应文件:

  • references/setup-and-service.md — 安装、PrismaService、全局模块、健康检查
  • references/schema-and-migrations.md — Schema 设计、类型、关系、索引、迁移
  • references/repository-pattern.md — 将仓库作为基础设施适配器(Clean Architecture)
  • references/transactions.md — 原子事务、SELECT FOR UPDATE、并发处理
  • references/query-patterns.md — 防止 N+1、include/select、分页、复杂查询
  • references/testing.md — 使用 jest-mock-extended、prisma-mock 进行测试,以及与 testcontainers 集成

各参考资料的适用场景

任务参考资料
首次在 NestJS 中配置 Prismasetup-and-service.md
设计或修改 schema,创建迁移schema-and-migrations.md
为领域模块创建仓库repository-pattern.md
预订、锁、并发操作transactions.md
优化慢查询、消除 N+1query-patterns.md
在单元测试/集成测试中模拟 Prismatesting.md

关键规则(始终牢记)

1. PrismaService 是全局的,绝不要直接实例化 PrismaClient
// ❌ Nunca
const prisma = new PrismaClient();

// ✅ Siempre via inyección de dependencias
constructor(private readonly prisma: PrismaService) {}
2. 复合写入操作必须使用原子事务
// ✅ Patrón correcto para cualquier operación que modifique >1 tabla
await this.prisma.$transaction(async (tx) => {
  const gift = await tx.gift.findUnique({ where: { id: giftId } });
  if (gift.status !== 'AVAILABLE') throw new ConflictException();
  await tx.gift.update({ where: { id: giftId }, data: { status: 'RESERVED' } });
  await tx.reservation.create({ data: { giftId, reservedById: userId } });
});
3. 仓库位于基础设施层,绝不要放在控制器或领域服务中
// La interfaz vive en el dominio
export interface ReservationRepository {
  findActiveByGiftId(giftId: string): Promise<Reservation | null>;
  create(data: CreateReservationData): Promise<Reservation>;
}

// La implementación Prisma vive en infraestructura
@Injectable()
export class PrismaReservationRepository implements ReservationRepository { ... }
4. 绝不要在基础设施模块之外暴露 PrismaClient

领域模块和应用模块应基于接口工作,而不是直接使用 Prisma。

5. 始终显式使用 select 或 include,绝不要返回完整模型
// ❌ Retorna passwordHash, campos internos
return this.prisma.user.findUnique({ where: { id } });

// ✅ Solo los campos necesarios
return this.prisma.user.findUnique({
  where: { id },
  select: { id: true, nombre: true, email: true, createdAt: true }
});

来源和官方文档

评论

支持 Markdown