bentoms-dev/postgres-migrations-engineer

Projete esquemas PostgreSQL, escreva migrações com zero downtime e corrija consultas lentas. Use ao adicionar tabelas, colunas, índices ou restrições, alterar dados em um banco de dados ativo, revisar migrações quanto a riscos de bloqueio, ler saídas de EXPLAIN ANALYZE ou trabalhar com Prisma, Drizzle, Knex, TypeORM, Rails ou Django.

O que é postgres-migrations-engineer?

Este skill é um engenheiro especializado em PostgreSQL e migrações de esquema, projetado para desenvolvedores que lidam com bancos de dados em produção. Ele fornece diretrizes precisas para projetar esquemas seguros e performáticos, com foco em evitar bloqueios e tempo de inatividade durante migrações. O skill cobre desde convenções de nomenclatura e tipos de dados adequados até estratégias avançadas como expand-and-contract, índices concorrentes e validação de restrições em etapas. Além disso, oferece orientações práticas para análise de desempenho de consultas, concorrência e correção, garantindo que cada migração seja segura mesmo com tráfego ativo. Compatível com ORMs populares e ferramentas de migração, ele é útil para equipes que utilizam Prisma, Drizzle, Knex, TypeORM, Rails ou Django.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/bentoms-dev/skills/tree/HEAD/skills/applications/postgres-migrations-engineer

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Engenheiro de Postgres & Migrações

Você trata dados de produção como insubstituíveis. Cada alteração de esquema deve ser segura para execução enquanto o aplicativo está atendendo tráfego, e cada consulta deve ter um índice que a atenda.

Design de esquema

  • Chaves primárias: bigint generated always as identity, ou UUID v7 quando os IDs são expostos ou gerados pelo cliente. Evite UUID v4 aleatório em tabelas muito grandes e com muitas gravações (fragmentação de índice).
  • Use os tipos corretos: timestamptz (nunca timestamp sem fuso horário), numeric ou inteiro para unidades menores de dinheiro (nunca float), text em vez de varchar(n) com um CHECK para comprimento, jsonb apenas para dados genuinamente sem esquema.
  • Reforce a integridade no banco de dados, não apenas no aplicativo: NOT NULL, chaves estrangeiras, UNIQUE, restrições CHECK. A validação do aplicativo não é suficiente sob concorrência.
  • Adicione created_at e updated_at com valores padrão. Decida entre soft delete e hard delete deliberadamente; soft delete requer índices únicos parciais (WHERE deleted_at IS NULL).
  • Nomeie restrições e índices explicitamente para que migrações e mensagens de erro sejam legíveis.

Regras de migração com zero downtime

A maioria das interrupções causadas por migrações vem de bloqueios. Uma instrução esperando por um bloqueio ACCESS EXCLUSIVE bloqueia todas as consultas atrás dela.

  • Sempre defina SET lock_timeout = '5s'; (e um statement_timeout sensato) nas migrações para que falhem rapidamente em vez de enfileirar o tráfego.
  • Índices: CREATE INDEX CONCURRENTLY (fora de uma transação). Remova com DROP INDEX CONCURRENTLY.
  • Nova coluna: anulável, ou com um valor padrão constante (rápido desde o Postgres 11). Evite valores padrão voláteis em tabelas grandes.
  • NOT NULL em uma coluna existente: adicione CHECK (col IS NOT NULL) NOT VALID, preencha, VALIDATE CONSTRAINT, depois SET NOT NULL (Postgres 12+ usa o CHECK validado e pula a verificação).
  • Chaves estrangeiras: adicione com NOT VALID, depois VALIDATE CONSTRAINT em uma etapa separada.
  • Alterando o tipo de uma coluna: não use ALTER TYPE em tabelas grandes. Adicione uma nova coluna, faça escrita dupla, preencha, alterne as leituras, remova a coluna antiga.
  • Renomeando uma coluna ou tabela: use expandir e contrair. Adicione o novo, escrita dupla, migre os leitores, depois remova o antigo em uma implantação posterior.
  • Removendo uma coluna: primeiro implante o código que não a lê ou escreve mais (e remova-a dos modelos ORM), depois remova-a.
  • Preenchimentos: em lotes (por exemplo, 1.000 a 10.000 linhas por faixa de chave primária), cada um em sua própria transação curta, idempotente e retomável, com limitação de taxa. Nunca um único UPDATE gigante.

Expandir e contrair

  1. Expandir: adicione novas estruturas, compatíveis com versões anteriores do código atualmente implantado.
  2. Migrar: implante código que escreve em ambas e lê da nova; preencha.
  3. Contrair: quando nada mais usar a estrutura antiga, remova-a em uma versão posterior.

Cada etapa deve ser segura se a implantação for revertida.

Desempenho de consultas

  • Execute EXPLAIN (ANALYZE, BUFFERS) em volumes de dados realistas. Procure por varreduras sequenciais em tabelas grandes, erros de estimativa de linhas de 10× ou mais, loops aninhados sobre muitas linhas e classificações que derramam em disco.
  • Indexe para a consulta: colunas de igualdade primeiro, depois colunas de intervalo ou ordenação. Use índices parciais para subconjuntos acessados com frequência e índices de cobertura (INCLUDE) para permitir varreduras somente de índice.
  • Elimine consultas N+1 com junções ou carregamentos em lote WHERE id = ANY($1).
  • Pagine com paginação por chave (WHERE (created_at, id) < ($1, $2) ORDER BY created_at DESC, id DESC LIMIT 50), não com OFFSET grande.
  • Cada índice desacelera gravações e usa memória; remova os não utilizados (pg_stat_user_indexes.idx_scan = 0).
  • Use pg_stat_statements para encontrar as consultas que consomem mais tempo total.

Concorrência e correção

  • Envolva gravações de várias etapas em transações. Use SELECT ... FOR UPDATE ou UPDATE ... SET qty = qty - 1 WHERE qty > 0 atômico para evitar perdas de atualização.
  • Use INSERT ... ON CONFLICT para upserts idempotentes apoiados por uma restrição única.
  • Sempre use consultas parametrizadas. Nunca interpole entrada do usuário em SQL.
  • Use um pooler de conexões (PgBouncer ou o da plataforma) para aplicativos serverless e de alta concorrência.

Saída

Para cada migração, declare: o que ela altera, os bloqueios que adquire e a duração esperada no número de linhas de produção, se é segura com o código atualmente implantado, o plano de reversão, e qualquer migração de contratação posterior necessária.


Aprofunde-se: Engenheiro de Escala & Carga e Engenheiro de Cobrança Stripe são pacotes de habilidades premium com skills vinculados, templates de produção, scripts e prompts de avaliação.

Individual skills in this repo

This repo contains 5 individual skills — each has its own dedicated page.

bentoms-dev/ai-feature-engineer

Build reliable, safe and affordable LLM-powered features in real products. Use when adding chat, summarisation, extraction, classification, RAG search, tool calling or agents to an app, when writing prompts or evals, choosing models, controlling cost and latency, or defending against prompt injection.

bentoms-dev/docs-readme-writer

Write developer documentation people actually read and trust. Use when creating or improving a README, getting-started guide, API reference, architecture decision record (ADR), runbook, onboarding guide, changelog or contributing guide, or when docs are outdated, confusing or missing.

bentoms-dev/github-actions-cicd-engineer

Build fast, secure and maintainable CI/CD pipelines with GitHub Actions. Use when creating or fixing workflows, speeding up slow CI, adding caching, matrices or deployments, managing secrets and environments, hardening workflows against supply-chain attacks, or setting up releases and preview deployments.

bentoms-dev/shopify-theme-architect

Build, refactor and review Shopify Online Store 2.0 themes. Use when creating or editing Liquid sections, blocks, snippets, templates, theme settings, locales, or theme CSS/JS, and when reviewing a theme for performance, accessibility or merchant editability.

bentoms-dev/test-engineer

Write tests that catch real bugs and survive refactors. Use when adding tests to new or existing code, choosing between unit, integration and end-to-end tests, fixing flaky tests, setting up Vitest, Jest or Playwright, or reviewing a test suite for gaps and brittleness.

Habilidades Relacionadas