数据库迁移
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/database-migration-1991513ccie-png 技能。
技能介绍
要解决的实际问题
手动执行 SQL 变更、多人同时改表、线上环境的 DDL 语句不可回滚,常常导致锁表、脏数据或服务不可用。database-migration 面向这些具体的工程痛点:
- 变更缺少版本记录,无法按顺序回放或回滚
- 大表上直接加列或加约束,容易阻塞写入
- 自动化工具把字段重命名当成 drop + add,导致数据丢失
- 多实例部署时,多个进程同时跑迁移,破坏元数据一致性
核心工作流
技能围绕六步展开,每一步都有可检查的输出:
- 评估变更类型:判断是向后兼容的增量变更还是破坏性变更,破坏性变更需要多阶段迁移。
- 选择迁移框架:根据技术栈匹配
Alembic(Python/SQLAlchemy)、Prisma Migrate(TypeScript/Prisma)、Flyway(Java/SQL)或Knex(Node.js),也覆盖Django Migrations和Sequelize。 - 生成迁移脚本:优先通过工具的 autogenerate 能力从 schema 差异生成脚本,再人工审阅和补全
downgrade逻辑;数据回填写进同一迁移文件,保证 schema 和数据变更原子化。 - 在 staging 验证:对镜像生产结构的数据库执行迁移,确认应用、查询和回滚路径都正常。
- 零宕机部署:使用 expand-and-contract 模式,先加新结构,双写,回填数据,切换读流量,最后收缩旧结构。
- 部署后监控:检查迁移框架的 status 命令和版本表,观察应用日志与数据库性能。
适用边界与注意点
- 始终手写回滚逻辑:不要假设部署失败后可以临时手写修复,回滚必须预先版本化。
- 审阅所有 autogenerate 结果:重命名字段可能被识别为 drop + add,需要改用
op.alter_column()或原生ALTER TABLE ... RENAME COLUMN。 - 大表加 NOT NULL 列:旧版 PostgreSQL 会锁表,应先加可空列,分批回填,再设置约束。
- 并发迁移:多实例部署时只允许一个实例执行迁移,可使用 advisory lock 或把迁移作为独立部署前置步骤。
- 枚举类型变更:PostgreSQL 的枚举加值不是事务性的,需要新建枚举、迁移列、再删除旧枚举;更灵活的方案是改用带
CHECK约束的VARCHAR。 - 纯数据迁移:不修改 schema 的字段加密或数据清洗,也必须放进版本化迁移文件,保证各环境一致可重放。
使用场景
- 线上 PostgreSQL 表需要加列并回填历史数据,要求不锁表、不停机
- 团队使用 Prisma Migrate,需要生成带 upgrade 和 downgrade 逻辑的版本迁移
- 多实例部署时需保证只有一个进程执行 Flyway 迁移,避免并发冲突
- CI 流水线中要对一次性数据库运行迁移,验证 upgrade 与 downgrade 路径
适合人员
- 后端工程师,需要为 SQLAlchemy 项目编写 Alembic 迁移并处理回滚
- 全栈开发者,在 TypeScript/Prisma 项目中管理 schema 变更与数据迁移
- 数据库管理员,负责在上线前验证 DDL 语句对大表和线上服务的影响
- DevOps 工程师,需要把迁移步骤接入 CI/CD 并实现零宕机发布