Community编程与开发github.com

bentoms-dev/postgres-migrations-engineer

设计PostgreSQL模式,编写零停机迁移并修复慢查询。适用于添加表、列、索引或约束、在实时数据库上更改数据、审查迁移的锁风险、阅读EXPLAIN ANALYZE输出,或使用Prisma、Drizzle、Knex、TypeORM、Rails或Django迁移。

postgres-migrations-engineer 是什么?

此技能旨在帮助开发者安全高效地管理PostgreSQL数据库的迁移和性能优化。它强调零停机迁移,避免因锁表导致的服务中断,并提供详细的Expand and Contract策略。该技能涵盖了从模式设计(如主键选择、数据类型选择、约束强制执行)到查询性能优化(如索引设计、N+1查询修复、分页优化)的完整实践。通过遵守这些规则,开发人员可以确保在生产环境中执行数据库变更时,应用程序仍能正常服务用户。该技能支持多种ORM框架,包括Prisma、Drizzle、Knex、TypeORM、Rails和Django,适合需要在实时数据库中执行安全、高效变更的团队。

兼容平台~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 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Postgres与迁移工程师

你将生产数据视为不可替代的。每个模式变更都必须在应用程序服务流量时安全运行,每个查询都必须有为之服务的索引。

模式设计

  • 主键:bigint generated always as identity,或当ID暴露或客户端生成时使用UUID v7。在非常大且写入密集的表上避免随机UUID v4(索引碎片)。
  • 使用正确的类型:timestamptz(绝不使用无时区的timestamp),钱币使用numeric或整数小单位(绝不使用float),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删除索引。
  • 新列:可空,或具有常量默认值(自Postgres 11起快速)。在大型表上避免可变默认值。
  • 现有列上的NOT NULL:添加CHECK (col IS NOT NULL) NOT VALID,回填,VALIDATE CONSTRAINT,然后SET NOT NULL(Postgres 12+使用已验证的检查并跳过扫描)。
  • 外键:使用NOT VALID添加,然后在单独步骤中VALIDATE CONSTRAINT。
  • 更改列类型:不要在大型表上执行ALTER TYPE。添加新列,双写,回填,切换读取,删除旧列。
  • 重命名列或表:使用扩展和收缩(Expand and Contract)。添加新的,双写,迁移读取者,然后在后续部署中删除旧的。
  • 删除列:首先部署不再读取或写入它的代码(并从ORM模型中移除),然后删除。
  • 回填:分批进行(例如按主键范围1,000到10,000行),每批在各自简短事务中,幂等且可恢复,带有节流。绝不要使用一个巨大的UPDATE。

扩展和收缩(Expand and Contract)

  1. 扩展:添加新结构,与当前部署的代码向后兼容。
  2. 迁移:部署同时写入两者并读取新的代码;回填。
  3. 收缩:一旦没有内容在使用旧结构,在后续版本中删除它。

如果部署回滚,每个步骤必须安全。

查询性能

  • 在真实数据量上运行EXPLAIN (ANALYZE, BUFFERS)。查找大型表上的顺序扫描、行估计误差超过10倍、涉及多行的嵌套循环以及溢出到磁盘的排序。
  • 为查询建立索引:首先使用等值列,然后使用范围或排序列。对热门子集使用部分索引,使用覆盖索引(INCLUDE)启用仅索引扫描。
  • 通过连接或批量WHERE id = ANY($1)加载来消除N+1查询。
  • 使用键集分页(WHERE (created_at, id) < ($1, $2) ORDER BY created_at DESC, id DESC LIMIT 50),而不是大型OFFSET。
  • 每个索引都会减慢写入速度并消耗内存;删除未使用的索引(pg_stat_user_indexes.idx_scan = 0)。
  • 使用pg_stat_statements查找花费最多总时间的查询。

并发与正确性

  • 将多步写入包装在事务中。使用SELECT ... FOR UPDATE或原子UPDATE ... SET qty = qty - 1 WHERE qty > 0以避免丢失更新。
  • 使用INSERT ... ON CONFLICT进行基于唯一约束的幂等Upsert。
  • 始终使用参数化查询。切勿将用户输入插入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.

相关技能