Pular para o conteúdo
Skillpedia
APIs e servidores (backend)280 mil · #99

prisma-patterns

Faz seu agente usar o Prisma ORM de forma eficiente em backends TypeScript. Ajuda com design, consultas, transações e evita armadilhas comuns.

O que ela faz

Este guia ajuda você a usar o Prisma ORM de forma mais eficiente em seus projetos de programação. Ele mostra as melhores práticas para organizar seus dados, escrever consultas rápidas e evitar problemas comuns.

Quando usar

  • ✓Ao criar ou mudar a estrutura do seu banco de dados com Prisma.
  • ✓Ao escrever o código que busca ou salva informações no banco de dados.
  • ✓Ao depurar erros em transações ou ao atualizar muitos dados de uma vez.

Exemplo do que pedir para a IA

“Como posso garantir que minhas consultas ao banco de dados sejam rápidas e seguras?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/prisma-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/prisma-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

O guia explica como configurar seu banco de dados, escolher as melhores formas de buscar dados e usar transações com segurança. Ele também alerta sobre armadilhas comuns que podem causar lentidão ou erros.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill prisma-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/prisma-patterns/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões Prisma

Padrões de produção e armadilhas não óbvias para Prisma ORM em backends TypeScript.

Verifique sua versão antes de aplicar os padrões. A superfície da API do Prisma evoluiu entre as principais versões:

npx prisma --version

Diferenças notáveis na API entre as versões:

  • relationJoins pode carregar relações via JOIN em vez de consultas separadas, mas pode causar explosão de linhas em relações 1:N grandes ou include profundas — compare ambos os métodos
  • O modificador de campo omit e a API prisma.$extends Client Extensions foram adicionados
  • Instalações mais recentes: o pacote pode ser nomeado prisma em vez de @prisma/client; PrismaClient pode exigir um adaptador de driver (por exemplo, @prisma/adapter-pg); datasource.url pode estar em prisma.config.ts em vez de schema.prisma
  • Comandos CLI (migrate dev, migrate deploy, generate) não foram alterados entre as versões

Quando Ativar

  • Projetando ou modificando modelos e relações do esquema Prisma
  • Escrevendo consultas, transações ou lógica de paginação
  • Usando updateMany, deleteMany ou qualquer operação em massa
  • Executando ou planejando migrações de banco de dados
  • Implantando em ambientes serverless (Vercel, Lambda, Cloudflare Workers)
  • Implementando soft delete ou filtragem de linhas multi-tenant

Conceitos Principais

Estratégia de ID

Estratégia Usar Quando Evitar Quando
@default(cuid()) Escolha padrão — segura para URL, ordenável, sem colisões IDs sequenciais necessários para sistemas externos
@default(uuid()) Interoperabilidade com sistemas não-Prisma necessária Tabelas com muitas escritas (UUIDs aleatórios fragmentam índices B-tree)
@default(autoincrement()) Tabelas de junção internas, logs de auditoria IDs voltados para o público (expõe a contagem de registros)

Padrões do Schema

model User {
  id        String    @id @default(cuid())
  email     String    @unique  // @unique already creates an index — no @@index needed
  name      String
  role      Role      @default(USER)
  posts     Post[]
  createdAt DateTime  @default(now())
  updatedAt DateTime  @updatedAt
  deletedAt DateTime?

  @@index([createdAt])
  @@index([deletedAt, createdAt]) // composite for soft-delete + sort queries
}
  • Adicione @@index em cada chave estrangeira e coluna usada em WHERE ou ORDER BY.
  • Declare deletedAt DateTime? antecipadamente quando o soft delete for um requisito previsível — adicioná-lo mais tarde requer uma migração em uma tabela ativa.
  • updatedAt @updatedAt é definido automaticamente pelo Prisma apenas em update e upsert (veja Anti-Padrões para a armadilha de atualização em massa).

include vs select

include select
Retorna Todos os campos escalares + relações especificadas Apenas campos especificados
Usar quando Você precisa da maioria dos campos mais uma relação Caminhos de alta performance, tabelas grandes, evitando excesso de busca
Performance Pode buscar em excesso em tabelas largas Payload mínimo, mais rápido em grandes conjuntos de dados
Nota Prisma 5 Usa JOIN por padrão (relationJoins) O mesmo
// include — all columns + relation
const user = await prisma.user.findUnique({
  where: { id },
  include: { posts: { select: { id: true, title: true } } },
});

// select — explicit allowlist
const user = await prisma.user.findUnique({
  where: { id },
  select: { id: true, email: true, name: true },
});

Nunca retorne entidades Prisma brutas de respostas de API — mapeie para DTOs de resposta para controlar os campos expostos:

// BAD: leaks passwordHash, deletedAt, internal fields
return await prisma.user.findUniqueOrThrow({ where: { id } });

// GOOD: explicit DTO mapping
const user = await prisma.user.findUniqueOrThrow({ where: { id } });
return { id: user.id, name: user.name, email: user.email };

Seleção de Forma de Transação

Situação Usar
Operações independentes, sem interdependência Forma de array
Etapa posterior depende do resultado anterior Forma interativa
Chamadas externas (e-mail, HTTP) envolvidas Fora da transação completamente
// Array form — batched in one round trip
const [user, post] = await prisma.$transaction([
  prisma.user.update({ where: { id }, data: { name } }),
  prisma.post.create({ data: { title, authorId: id } }),
]);

// Interactive form — use tx client only, never the outer prisma client
const post = await prisma.$transaction(async (tx) => {
  const user = await tx.user.findUniqueOrThrow({ where: { id } });
  if (user.role !== 'ADMIN') throw new Error('Forbidden');
  return tx.post.create({ data: { title, authorId: user.id } });
});

Singleton PrismaClient

…

Perguntas frequentes

O que é Prisma ORM?

Prisma ORM é uma ferramenta que ajuda programadores a interagir com bancos de dados de forma mais fácil e segura, especialmente em projetos com TypeScript.

Por que devo me preocupar com 'padrões' e 'armadilhas'?

Seguir bons padrões e evitar armadilhas garante que seu aplicativo seja rápido, estável e menos propenso a erros, economizando tempo e esforço na manutenção.

O que são 'transações'?

Transações são como um pacote de operações no banco de dados. Ou todas as operações dentro do pacote funcionam, ou nenhuma delas funciona, garantindo a consistência dos dados.

Detalhes

Descrição original do autor

Prisma ORM patterns for TypeScript backends — schema design, query optimization, transactions, pagination, and critical traps like updateMany returning count not records, $transaction timeouts, migrate dev resetting the DB, @updatedAt skipped on bulk writes, and serverless connection exhaustion. Use when writing a Prisma schema or query, or debugging transactions, migrations, or serverless connect

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#99
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas