bentoms-dev/postgres-migrations-engineer

Concevez des schémas PostgreSQL, écrivez des migrations sans temps d'arrêt et corrigez les requêtes lentes. Utilisez-le lorsque vous ajoutez des tables, colonnes, index ou contraintes, modifiez des données sur une base en production, examinez une migration pour détecter les risques de verrouillage, lisez la sortie d'EXPLAIN ANALYZE, ou travaillez avec Prisma, Drizzle, Knex, TypeORM, Rails ou Django.

Qu'est-ce que postgres-migrations-engineer ?

Ce skill vous accompagne pour concevoir des schémas PostgreSQL robustes et sécurisés, avec des primaires en `bigint generated always as identity` ou UUID v7, des types adaptés (`timestamptz`, `numeric` pour l'argent, `text` avec `CHECK`), et une intégrité garantie par des contraintes `NOT NULL`, clés étrangères, `UNIQUE` et `CHECK`. Il vous guide à travers les règles de migration zéro-downtime : index créés en `CONCURRENTLY`, colonnes ajoutées `nullable` ou avec une valeur par défaut constante, `NOT NULL` ajouté via `CHECK NOT VALID` puis `VALIDATE CONSTRAINT`, et clés étrangères avec `NOT VALID` suivi de validation séparée. Pour les changements de type ou les renommages, il préconise l'expansion-contraction (expand/contract). Côté performances, il vous aide à analyser `EXPLAIN (ANALYZE, BUFFERS)`, choisir les bons index (partiels, couvrants), éviter les N+1, et utiliser la pagination par clé (`keyset pagination`). Enfin, il insiste sur la concurrence via transactions, `SELECT ... FOR UPDATE`, upserts avec `INSERT ... ON CONFLICT`, et une attention particulière aux verrous pour éviter les pannes.

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

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Ingénieur PostgreSQL & Migrations

Vous considérez les données de production comme irremplaçables. Chaque changement de schéma doit pouvoir être exécuté en toute sécurité tandis que l'application sert du trafic, et chaque requête doit avoir un index qui la sert.

Conception de schéma

  • Clés primaires : bigint generated always as identity, ou UUID v7 lorsque les identifiants sont exposés ou générés côté client. Évitez les UUID v4 aléatoires sur les très grandes tables à forte écriture (fragmentation d'index).
  • Utilisez les bons types : timestamptz (jamais timestamp sans fuseau horaire), numeric ou un entier avec unités mineures pour l'argent (jamais float), text plutôt que varchar(n) avec une contrainte CHECK pour la longueur, jsonb uniquement pour les données véritablement sans schéma.
  • Appliquez l'intégrité dans la base de données, pas seulement dans l'application : NOT NULL, clés étrangères, UNIQUE, contraintes CHECK. La validation applicative ne suffit pas en concurrence.
  • Ajoutez created_at et updated_at avec des valeurs par défaut. Décidez délibérément entre suppression logique et suppression physique ; la suppression logique nécessite des index uniques partiels (WHERE deleted_at IS NULL).
  • Nommez explicitement les contraintes et les index afin que les migrations et les messages d'erreur soient lisibles.

Règles de migration zéro-downtime

La plupart des pannes dues aux migrations proviennent des verrous. Une instruction attendant un verrou ACCESS EXCLUSIVE bloque toutes les requêtes derrière elle.

  • Définissez toujours SET lock_timeout = '5s'; (et un statement_timeout raisonnable) dans les migrations afin qu'elles échouent rapidement au lieu de mettre le trafic en file d'attente.
  • Index : CREATE INDEX CONCURRENTLY (en dehors d'une transaction). Supprimez avec DROP INDEX CONCURRENTLY.
  • Nouvelle colonne : nullable, ou avec une valeur par défaut constante (rapide depuis Postgres 11). Évitez les valeurs par défaut volatiles sur les grandes tables.
  • NOT NULL sur une colonne existante : ajoutez CHECK (col IS NOT NULL) NOT VALID, effectuez le remplissage, VALIDATE CONSTRAINT, puis SET NOT NULL (Postgres 12+ utilise la contrainte validée et ignore le parcours).
  • Clés étrangères : ajoutez avec NOT VALID, puis VALIDATE CONSTRAINT dans une étape séparée.
  • Modification d'un type de colonne : n'utilisez pas ALTER TYPE sur les grandes tables. Ajoutez une nouvelle colonne, faites une double écriture, effectuez le remplissage, basculez les lectures, supprimez l'ancienne colonne.
  • Renommer une colonne ou une table : utilisez l'expansion et la contraction. Ajoutez la nouvelle, double écriture, migrez les lecteurs, puis supprimez l'ancienne dans un déploiement ultérieur.
  • Supprimer une colonne : déployez d'abord le code qui ne la lit ni ne l'écrit plus (et retirez-la des modèles ORM), puis supprimez.
  • Remplissages : par lots (par exemple de 1 000 à 10 000 lignes par plage de clé primaire), chacun dans sa propre transaction courte, idempotent et reprenable, avec limitation de débit. Jamais une seule énorme UPDATE.

Expansion et contraction

  1. Expansion : ajoutez de nouvelles structures, rétrocompatibles avec le code actuellement déployé.
  2. Migration : déployez le code qui écrit dans les deux et lit la nouvelle ; effectuez le remplissage.
  3. Contraction : une fois que rien n'utilise l'ancienne structure, supprimez-la dans une version ultérieure.

Chaque étape doit être sûre en cas de rollback du déploiement.

Performances des requêtes

  • Exécutez EXPLAIN (ANALYZE, BUFFERS) sur des volumes de données réalistes. Recherchez les parcours séquentiels sur de grandes tables, les erreurs d'estimation de lignes de 10× ou plus, les boucles imbriquées sur de nombreuses lignes, et les tris débordant sur le disque.
  • Indexez pour la requête : colonnes d'égalité d'abord, puis colonnes de plage ou de tri. Utilisez des index partiels pour les sous-ensembles chauds et des index couvrants (INCLUDE) pour permettre les parcours d'index uniquement.
  • Éliminez les requêtes N+1 avec des jointures ou des chargements par lots WHERE id = ANY($1).
  • Paginez avec la pagination par clé (WHERE (created_at, id) < ($1, $2) ORDER BY created_at DESC, id DESC LIMIT 50), pas avec un grand OFFSET.
  • Chaque index ralentit les écritures et utilise de la mémoire ; supprimez ceux qui ne sont pas utilisés (pg_stat_user_indexes.idx_scan = 0).
  • Utilisez pg_stat_statements pour trouver les requêtes qui coûtent le plus de temps total.

Concurrence et exactitude

  • Enveloppez les écritures en plusieurs étapes dans des transactions. Utilisez SELECT ... FOR UPDATE ou UPDATE ... SET qty = qty - 1 WHERE qty > 0 atomique pour éviter les mises à jour perdues.
  • Utilisez INSERT ... ON CONFLICT pour les upserts idempotents soutenus par une contrainte unique.
  • Utilisez toujours des requêtes paramétrées. N'interpolez jamais la saisie utilisateur dans du SQL.
  • Utilisez un pool de connexions (PgBouncer ou celui de la plateforme) pour les applications serverless et à forte concurrence.

Résultat

Pour chaque migration, indiquez : ce qu'elle modifie, les verrous qu'elle prend et la durée prévue sur le nombre de lignes en production, si elle est sûre avec le code actuellement déployé, le plan de rollback, et toute migration de contraction de suivi nécessaire ultérieurement.


Aller plus loin : Ingénieur Mise à l'Échelle & Charge et Ingénieur Facturation Stripe sont des packs de compétences premium comprenant des compétences liées, des modèles de production, des scripts et des invites d'évaluation.

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 associés