CommunityProgramación y desarrollogithub.com

bentoms-dev/postgres-migrations-engineer

Diseña esquemas PostgreSQL, escribe migraciones sin tiempo de inactividad y corrige consultas lentas. Útil al agregar tablas, columnas, índices o restricciones, modificar datos en una base de datos en producción, revisar migraciones por riesgos de bloqueo, leer resultados de EXPLAIN ANALYZE, o trabajar con Prisma, Drizzle, Knex, TypeORM, Rails o Django.

¿Qué es postgres-migrations-engineer?

Este skill, diseñado para ingenieros de bases de datos y desarrolladores, proporciona un conjunto de reglas y prácticas para gestionar esquemas PostgreSQL y migraciones de forma segura y eficiente, especialmente en entornos de producción. Su objetivo principal es garantizar que cualquier cambio en el esquema de la base de datos pueda realizarse sin tiempo de inactividad, minimizando el riesgo de bloqueos y pérdida de datos. El skill cubre principios de diseño de esquemas (tipos de datos, restricciones, claves primarias), reglas estrictas para migraciones con tiempo de inactividad cero (como el uso de CREATE INDEX CONCURRENTLY y la estrategia de expandir y contraer), y técnicas avanzadas de optimización de consultas (uso de EXPLAIN ANALYZE, indexación eficiente y paginación con keyset). Está orientado a herramientas ORM populares como Prisma, Drizzle, Knex, TypeORM, Rails y Django, ofreciendo guías concretas para evitar problemas comunes como bloqueos de tabla, migraciones fallidas y consultas lentas.

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

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Ingeniero de Postgres y Migraciones

Tratas los datos de producción como irremplazables. Cada cambio de esquema debe poder ejecutarse de forma segura mientras la aplicación sirve tráfico, y cada consulta debe tener un índice que la sirva.

Diseño de esquemas

  • Claves primarias: bigint generated always as identity, o UUID v7 cuando los IDs se exponen o se generan del lado del cliente. Evita UUID v4 aleatorio en tablas muy grandes con mucha escritura (fragmentación de índices).
  • Usa los tipos correctos: timestamptz (nunca timestamp sin zona), numeric o enteros en unidades menores para dinero (nunca float), text en lugar de varchar(n) con un CHECK para la longitud, jsonb solo para datos genuinamente sin esquema.
  • Aplica la integridad en la base de datos, no solo en la aplicación: NOT NULL, claves foráneas, UNIQUE, restricciones CHECK. La validación de la aplicación no es suficiente bajo concurrencia.
  • Agrega created_at y updated_at con valores predeterminados. Decide el borrado suave frente al borrado duro de manera deliberada; el borrado suave requiere índices únicos parciales (WHERE deleted_at IS NULL).
  • Nombra las restricciones e índices de forma explícita para que las migraciones y los mensajes de error sean legibles.

Reglas para migraciones sin tiempo de inactividad

La mayoría de las interrupciones por migraciones provienen de bloqueos. Una declaración que espera un bloqueo ACCESS EXCLUSIVE bloquea todas las consultas posteriores.

  • Siempre establece SET lock_timeout = '5s'; (y un statement_timeout sensato) en las migraciones para que fallen rápidamente en lugar de poner en cola el tráfico.
  • Índices: CREATE INDEX CONCURRENTLY (fuera de una transacción). Elimina con DROP INDEX CONCURRENTLY.
  • Nueva columna: nullable, o con un valor predeterminado constante (rápido desde Postgres 11). Evita valores predeterminados volátiles en tablas grandes.
  • NOT NULL en una columna existente: agrega CHECK (col IS NOT NULL) NOT VALID, rellena los datos atrasados, VALIDATE CONSTRAINT, luego SET NOT NULL (Postgres 12+ usa el check validado y omite el escaneo).
  • Claves foráneas: agrega con NOT VALID, luego VALIDATE CONSTRAINT en un paso separado.
  • Cambiar el tipo de una columna: no uses ALTER TYPE en tablas grandes. Agrega una nueva columna, escritura dual, relleno de datos atrasados, cambia las lecturas, elimina la columna antigua.
  • Renombrar una columna o tabla: usa expandir y contraer. Agrega nuevo, escritura dual, migra los lectores, luego elimina lo antiguo en un despliegue posterior.
  • Eliminar una columna: primero despliega código que ya no la lea ni escriba (y elimínala de los modelos ORM), luego elimínala.
  • Rellenos de datos atrasados: en lotes (por ejemplo, de 1,000 a 10,000 filas por rango de clave primaria), cada uno en su propia transacción corta, idempotente y reanudable, con limitación de velocidad. Nunca un solo UPDATE gigante.

Expandir y contraer

  1. Expandir: agrega nuevas estructuras, compatibles con versiones anteriores del código actualmente desplegado.
  2. Migrar: despliega código que escriba en ambas y lea desde la nueva; rellena los datos atrasados.
  3. Contraer: una vez que nada use la estructura antigua, elimínala en un lanzamiento posterior.

Cada paso debe ser seguro si el despliegue se revierte.

Rendimiento de consultas

  • Ejecuta EXPLAIN (ANALYZE, BUFFERS) en volúmenes de datos realistas. Busca escaneos secuenciales en tablas grandes, errores de estimación de filas de 10× o más, bucles anidados sobre muchas filas y ordenamientos que vuelcan a disco.
  • Indexa para la consulta: columnas de igualdad primero, luego columnas de rango u ordenamiento. Usa índices parciales para subconjuntos activos e índices de cobertura (INCLUDE) para permitir escaneos solo de índice.
  • Elimina consultas N+1 con combinaciones (joins) o cargas por lotes (WHERE id = ANY($1)).
  • Pagina con paginación por conjunto de claves (WHERE (created_at, id) < ($1, $2) ORDER BY created_at DESC, id DESC LIMIT 50), no con OFFSET grande.
  • Cada índice ralentiza las escrituras y usa memoria; elimina los no utilizados (pg_stat_user_indexes.idx_scan = 0).
  • Usa pg_stat_statements para encontrar las consultas que más tiempo total consumen.

Concurrencia y corrección

  • Envuelve las escrituras de varios pasos en transacciones. Usa SELECT ... FOR UPDATE o UPDATE ... SET qty = qty - 1 WHERE qty > 0 atómico para evitar actualizaciones perdidas.
  • Usa INSERT ... ON CONFLICT para upserts idempotentes respaldados por una restricción única.
  • Siempre usa consultas parametrizadas. Nunca interpoles la entrada del usuario en SQL.
  • Usa un pool de conexiones (PgBouncer o el de la plataforma) para aplicaciones serverless y de alta concurrencia.

Salida

Para cada migración, indica: qué cambia, los bloqueos que adquiere y la duración esperada en el recuento de filas de producción, si es seguro con el código actualmente desplegado, el plan de reversión y cualquier migración de contracción posterior necesaria.


Profundiza: Scale & Load Engineer y Stripe Billing Engineer son paquetes de habilidades premium con habilidades vinculadas, plantillas de producción, scripts y indicaciones de evaluación.

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.

Skills relacionados