Communityコーディング&開発github.com

Bentoms-dev/Postgresマイグレーションエンジニア

PostgreSQLスキーマの設計、ダウンタイムゼロのマイグレーション作成、低速クエリの修正を行います。テーブル、カラム、インデックス、制約の追加、稼働中のデータベースでのデータ変更、ロックリスクのレビュー、EXPLAIN ANALYZE出力の読み取り、Prisma、Drizzle、Knex、TypeORM、Rails、Djangoのマイグレーション作業時に使用します。

Postgresマイグレーションエンジニア とは?

このスキルは、PostgreSQLを扱うエンジニア向けに設計されており、本番データを不可逆的な資産として扱い、すべてのスキーマ変更がアプリケーションのトラフィック処理中でも安全に実行できることを保証します。データベース設計、ダウンタイムゼロのマイグレーション、クエリパフォーマンス最適化、および並行処理とデータ整合性の確保をカバーします。主キーにbigint identityやUUID v7を使用し、適切なデータ型(例:timestamptz、numeric)を強制し、データベースレベルでNOT NULLや外部キーなどの制約を適用することを推奨します。ゼロダウンタイムマイグレーションには、ロックタイムアウトの設定、CONCURRENTLYを使用したインデックス作成、NOT VALID制約のバックフィル、Expand and Contractパターンによる移行など、安全な手法を提供します。クエリパフォーマンスのセクションでは、EXPLAIN ANALYZEの使用、インデックス戦略、N+1問題の防止、キーセットページネーション、未使用インデックスの特定方法を解説します。このスキルは、Prisma、Drizzle、Knex、TypeORM、Rails、Djangoなど主要なORMやフレームワークと互換性があり、各マイグレーションの出力仕様も定めています。

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

Installed? Explore more コーディング&開発 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

Postgres & マイグレーションエンジニア

本番データはかけがえのないものとして扱います。すべてのスキーマ変更は、アプリケーションがトラフィックを処理している間も安全に実行でき、すべてのクエリにはそれをサポートするインデックスが存在しなければなりません。

スキーマ設計

  • プライマリキー: bigint generated always as identity、またはIDが公開されるかクライアント側で生成される場合はUUID v7。非常に大規模で書き込みの多いテーブルではランダムなUUID v4を避ける(インデックスの断片化)。
  • 適切な型を使用: timestamptz(タイムゾーンなしのtimestampは使わない)、金額にはnumericまたは整数の補助単位(floatは使わない)、長さ制限にはCHECKを付けたtext(varchar(n)の代わりに)、真にスキーマレスのデータにのみjsonb。
  • アプリだけでなくデータベースでも整合性を強制: NOT NULL、外部キー、UNIQUE、CHECK制約。並行処理下ではアプリケーションのバリデーションだけでは不十分。
  • created_atとupdated_atはデフォルト値とともに追加。ソフトデリートとハードデリートは意図的に決定。ソフトデリートには部分ユニークインデックス(WHERE deleted_at IS NULL)が必要。
  • 制約とインデックスに明示的に名前を付け、マイグレーションとエラーメッセージを読みやすくする。

ダウンタイムゼロのマイグレーションルール

マイグレーションによる障害のほとんどはロックが原因です。ACCESS EXCLUSIVEロックを待つステートメントは、後続のすべてのクエリをブロックします。

  • マイグレーションでは常にSET lock_timeout = '5s';(および適切なstatement_timeout)を設定し、トラフィックをキューイングする代わりに速やかに失敗させる。
  • インデックス: CREATE INDEX CONCURRENTLY(トランザクション外)。削除はDROP INDEX CONCURRENTLYを使用。
  • 新しいカラム: NULL許容、または定数のデフォルト値(Postgres 11以降は高速)。大きなテーブルでは揮発性のデフォルトは避ける。
  • 既存カラムへのNOT NULL: CHECK (col IS NOT NULL) NOT VALIDを追加、バックフィル、VALIDATE CONSTRAINT、その後SET NOT NULL(Postgres 12以降では検証済みのCHECKを使用してスキャンをスキップ)。
  • 外部キー: NOT VALIDで追加し、別のステップでVALIDATE CONSTRAINTを実行。
  • カラム型の変更: 大きなテーブルではALTER TYPEを実行しない。新しいカラムを追加し、デュアルライト、バックフィル、読み取りを切り替え、古いカラムを削除。
  • カラムまたはテーブルのリネーム: Expand and Contractを使用。新しいものを追加、デュアルライト、読み取りを移行、後のデプロイで古いものを削除。
  • カラムの削除: 最初にそのカラムを読み書きしないコードをデプロイし(ORMモデルからも削除)、その後削除。
  • バックフィル: バッチ処理(例:プライマリキー範囲で1,000~10,000行ずつ)、それぞれを短いトランザクションで、冪等かつ再開可能に、スロットリングをかけて実行。決して1回の巨大なUPDATEは行わない。

Expand and Contract

  1. Expand: 現在デプロイされているコードと後方互換性のある新しい構造を追加。
  2. Migrate: 新旧両方に書き込み、新しい方を読み取るコードをデプロイ。バックフィルを実行。
  3. Contract: 古い構造を使用するものがなくなったら、後のリリースでそれを削除。

各ステップは、デプロイがロールバックされた場合でも安全でなければなりません。

クエリパフォーマンス

  • 現実的なデータ量でEXPLAIN (ANALYZE, BUFFERS)を実行。大きなテーブルでのシーケンシャルスキャン、10倍以上の行推定誤差、多数の行にわたるネステッドループ、ディスクへのソートのスピルを確認。
  • クエリに合わせたインデックス設計:等価条件のカラムを最初に、次に範囲またはソートカラム。ホットなサブセットには部分インデックス、インデックスオンリースキャンを可能にするカバリングインデックス(INCLUDE)を使用。
  • N+1クエリを結合またはバッチ化されたWHERE id = ANY($1)ロードで排除。
  • 大きなOFFSETではなくキーセットページネーション(WHERE (created_at, id) < ($1, $2) ORDER BY created_at DESC, id DESC LIMIT 50)を使用。
  • すべてのインデックスは書き込みを遅くしメモリを使用する。未使用のインデックスは削除(pg_stat_user_indexes.idx_scan = 0)。
  • pg_stat_statementsを使用して、合計時間が最も大きいクエリを見つける。

並行処理と正確性

  • 複数ステップの書き込みはトランザクションでラップ。SELECT ... FOR UPDATEまたはアトミックなUPDATE ... SET qty = qty - 1 WHERE qty > 0を使用して更新の喪失を防ぐ。
  • 一意制約に基づく冪等なアップサートにはINSERT ... ON CONFLICTを使用。
  • 常にパラメーター化クエリを使用。ユーザー入力をSQLに直接埋め込まない。
  • サーバーレスおよび高並行アプリケーションにはコネクションプーラー(PgBouncerまたはプラットフォームのもの)を使用。

出力

各マイグレーションについて、以下を明記: 変更内容、取得するロックと本番行数での予想期間、現在デプロイされているコードとの互換性、ロールバック計画、後で必要なフォローアップのコントラクトマイグレーション。


さらに深く: Scale & Load Engineer と Stripe Billing Engineer は、リンクされたスキル、プロダクションテンプレート、スクリプト、評価プロンプトを備えたプレミアムスキルパックです。

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.

関連スキル