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
Mensagem pronta para colar
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-patternsOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/prisma-patterns/SKILL.md -o SKILL.mdConteú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 --versionDiferenças notáveis na API entre as versões:
relationJoinspode carregar relações via JOIN em vez de consultas separadas, mas pode causar explosão de linhas em relações 1:N grandes ouincludeprofundas — compare ambos os métodos- O modificador de campo
omite a APIprisma.$extendsClient Extensions foram adicionados- Instalações mais recentes: o pacote pode ser nomeado
prismaem vez de@prisma/client;PrismaClientpode exigir um adaptador de driver (por exemplo,@prisma/adapter-pg);datasource.urlpode estar emprisma.config.tsem vez deschema.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,deleteManyou 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
@@indexem cada chave estrangeira e coluna usada emWHEREouORDER 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 emupdateeupsert(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
Comentários
- …
Mais skills deste repositório
accessibility
Ajuda seu agente a criar interfaces que todos possam usar. Garante que sites e aplicativos funcionem bem para pessoas com deficiência, como cegos ou com mobilidade reduzida.
affaan-m/ECC
agent-architecture-audit
Faz seu agente verificar se tudo está funcionando corretamente. Ele encontra e conserta problemas em sistemas de IA, garantindo que funcionem como esperado.
affaan-m/ECC
agent-eval
Ajuda seu agente a comparar diferentes ferramentas de programação de IA. Ele mede qual é mais rápido, barato e confiável para realizar tarefas específicas.
affaan-m/ECC
agent-harness-construction
Faz seu agente entender melhor como realizar tarefas. Ele otimiza as ferramentas e instruções que o agente usa para aumentar suas chances de sucesso.
affaan-m/ECC
Skills parecidas
api-and-interface-design
Ajuda a criar APIs e interfaces bem definidas. É útil ao projetar como diferentes partes de um software vão se comunicar.
addyosmani/agent-skills
mason
Ajuda seu agente a escrever código limpo e funcional. Ele segue as regras definidas para garantir que tudo funcione como esperado.
sickn33/agentic-awesome-skills
max
Faz seu agente melhorar o código existente sem mudar o que ele faz. Ele deixa o código mais fácil de ler e manter.
sickn33/agentic-awesome-skills