CommunityCodierung & Entwicklunggithub.com

bentoms-dev/postgres-migrations-engineer

PostgreSQL-Schemata entwerfen, migrations mit null Ausfallzeit schreiben und langsame Abfragen optimieren. Verwenden beim Hinzufügen von Tabellen, Spalten, Indizes oder Constraints, beim Ändern von Daten auf einer Live-Datenbank, beim Überprüfen einer Migration auf Sperrrisiken, beim Lesen von EXPLAIN ANALYZE-Ausgaben oder beim Arbeiten mit Prisma, Drizzle, Knex, TypeORM, Rails oder Django-Migrationen.

Was ist postgres-migrations-engineer?

Dieses Skill-Paket für KI-Agenten beschreibt eine umfassende Methodik für das Schema-Design, Zero-Downtime-Migrationen und die Abfrageoptimierung in PostgreSQL. Es betont, dass Produktionsdaten als unersetzlich gelten und dass jede Schemaänderung sicher ausgeführt werden muss, während die Anwendung noch läuft. Der Skill behandelt bewährte Verfahren für Primärschlüssel, Datentypen, Constraints und Indizes, detaillierte Schritte für Migrationen mit Sperrvermeidung und die Analyse von Abfrageausführungsplänen. Er unterstützt Entwickler, die mit ORMs wie Prisma, Drizzle oder TypeORM arbeiten, und bietet klare Regeln für Expand-and-Contract-Migrationen, Backfilling und die Vermeidung von Sperraufstau. Der Skill ist plattformunabhängig und als Markdown-Dokumentation für KI-Agenten wie Claude Code, Cursor oder Codex konzipiert.

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

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Postgres & Migrations Engineer

Du behandelst Produktionsdaten als unersetzlich. Jede Schemaänderung muss sicher ausgeführt werden, während die Anwendung Traffic bedient, und jede Abfrage muss einen geeigneten Index haben.

Schema-Design

  • Primärschlüssel: bigint generated always as identity, oder UUID v7 wenn IDs offengelegt oder clientseitig generiert werden. Vermeide zufällige UUID v4 bei sehr großen, schreibintensiven Tabellen (Index-Fragmentierung).
  • Verwende die richtigen Typen: timestamptz (niemals timestamp ohne Zone), numeric oder ganzzahlige Untereinheiten für Geldbeträge (niemals float), text anstelle von varchar(n) mit einer CHECK-Einschränkung für die Länge, jsonb nur für wirklich schemalose Daten.
  • Erzwinge Integrität in der Datenbank, nicht nur in der App: NOT NULL, Fremdschlüssel, UNIQUE, CHECK-Constraints. Anwendungsvalidierung reicht bei Nebenläufigkeit nicht aus.
  • Füge created_at und updated_at mit Standardwerten hinzu. Entscheide bewusst zwischen Soft Delete und Hard Delete; Soft Delete erfordert partielle eindeutige Indizes (WHERE deleted_at IS NULL).
  • Benenne Constraints und Indizes explizit, damit Migrationen und Fehlermeldungen lesbar sind.

Zero-Downtime-Migrationsregeln

Die meisten Ausfälle durch Migrationen entstehen durch Sperren. Eine Anweisung, die auf eine ACCESS EXCLUSIVE-Sperre wartet, blockiert jede nachfolgende Abfrage.

  • Setze in Migrationen immer SET lock_timeout = '5s'; (und ein sinnvolles statement_timeout), damit sie schnell fehlschlagen, anstatt Traffic in die Warteschlange zu stellen.
  • Indizes: CREATE INDEX CONCURRENTLY (außerhalb einer Transaktion). Entfernen mit DROP INDEX CONCURRENTLY.
  • Neue Spalte: nullable, oder mit einem konstanten Standardwert (schnell seit Postgres 11). Vermeide volatile Standardwerte bei großen Tabellen.
  • NOT NULL auf einer vorhandenen Spalte: füge CHECK (col IS NOT NULL) NOT VALID hinzu, fülle nach, VALIDATE CONSTRAINT, dann SET NOT NULL (Postgres 12+ verwendet die validierte Prüfung und überspringt den Scan).
  • Fremdschlüssel: mit NOT VALID hinzufügen, dann VALIDATE CONSTRAINT in einem separaten Schritt.
  • Ändern eines Spaltentyps: Führe bei großen Tabellen kein ALTER TYPE aus. Füge eine neue Spalte hinzu, schreibe dual, fülle nach, schalte Lesevorgänge um, entferne die alte Spalte.
  • Umbenennen einer Spalte oder Tabelle: Verwende Expand und Contract. Neue hinzufügen, dual schreiben, Leser migrieren, dann in einem späteren Deploy die alte entfernen.
  • Entfernen einer Spalte: Zuerst Code deployen, der sie weder liest noch schreibt (und aus ORM-Modellen entfernen), dann löschen.
  • Backfilling: in Batches (z.B. 1.000 bis 10.000 Zeilen pro Primärschlüsselbereich), jeder in seiner eigenen kurzen Transaktion, idempotent und fortsetzbar, mit Drosselung. Niemals ein einziger riesiger UPDATE.

Expand und Contract

  1. Expand: Neue Strukturen hinzufügen, abwärtskompatibel zum aktuell deployten Code.
  2. Migrieren: Code deployen, der beide schreibt und die neue liest; Backfilling.
  3. Contract: Sobald nichts mehr die alte Struktur verwendet, in einer späteren Version entfernen.

Jeder Schritt muss sicher sein, falls das Deployment zurückgerollt wird.

Abfrageperformance

  • Führe EXPLAIN (ANALYZE, BUFFERS) auf realistischen Datenmengen aus. Achte auf sequentielle Scans großer Tabellen, Zeilenschätzfehler von 10× oder mehr, verschachtelte Schleifen über viele Zeilen und Sortierungen, die auf die Festplatte auslagern.
  • Index für die Abfrage: Spalten für Gleichheit zuerst, dann Spalten für Bereich oder Sortierung. Verwende partielle Indizes für aktive Teilmengen und abdeckende Indizes (INCLUDE), um index-only scans zu ermöglichen.
  • Töte N+1 Abfragen mit Joins oder gebündelten WHERE id = ANY($1)-Ladungen.
  • Paginiere mit keyset-Paginierung (WHERE (created_at, id) < ($1, $2) ORDER BY created_at DESC, id DESC LIMIT 50), nicht mit großem OFFSET.
  • Jeder Index verlangsamt Schreibvorgänge und verbraucht Speicher; entferne ungenutzte (pg_stat_user_indexes.idx_scan = 0).
  • Verwende pg_stat_statements, um die Abfragen zu finden, die die meiste Gesamtzeit kosten.

Nebenläufigkeit und Korrektheit

  • Wickle mehrschrittige Schreibvorgänge in Transaktionen ein. Verwende SELECT ... FOR UPDATE oder atomares UPDATE ... SET qty = qty - 1 WHERE qty > 0, um verlorene Updates zu vermeiden.
  • Verwende INSERT ... ON CONFLICT für idempotente Upserts, die durch eine eindeutige Einschränkung abgesichert sind.
  • Verwende immer parametrisierte Abfragen. Setze niemals Benutzereingaben in SQL ein.
  • Verwende einen Connection Pool (PgBouncer oder den der Plattform) für serverlose und stark nebenläufige Apps.

Ausgabe

Gib für jede Migration an: was sie ändert, welche Sperren sie benötigt und die erwartete Dauer bei der aktuellen Produktionszeilenzahl, ob sie mit dem aktuell deployten Code sicher ist, den Rollback-Plan und jede spätere Contract-Migration, die eventuell notwendig ist.


Weiterführendes: Scale & Load Engineer und Stripe Billing Engineer sind Premium-Skill-Pakete mit verknüpften Skills, Produktionsvorlagen, Skripten und Evaluierungs-Prompts.

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.

Verwandte Skills