批次1: req-prd 瘦身 + req-design 重定位 + dev-coding 聚焦 批次2: dev-review 新建 + review-checklist 插件 批次3: dev-integration 新建 + req-compare 拆出 批次4: 插件完善 (req-research/db-migration/dev-scaffold/deploy-rollback) 批次5: 平台拆分 (dev-ios/dev-android/dev-mcp/dev-pda) + dev 分组更新 批次6: marketplace.json 32→44 plugins Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.8 KiB
2.8 KiB
name, description
| name | description |
|---|---|
| db-migration | 数据库变更方案插件。Migration 脚本生成、数据迁移策略、回滚方案。挂载在 design 阶段,涉及数据库变更时由 req-design 推荐激活。 |
数据库变更方案插件 (db-migration)
概述
当需求涉及数据库结构变更时使用,确保变更安全、可回滚。
触发条件:
- 新增/修改/删除表或字段
- 数据迁移(旧数据转换)
- 索引优化
Migration 规范
文件命名
backend/migrations/YYYYMMDDHHMMSS_description.up.sql # 正向迁移
backend/migrations/YYYYMMDDHHMMSS_description.down.sql # 回滚迁移
安全规则
| 操作 | 风险等级 | 注意事项 |
|---|---|---|
| ADD COLUMN (nullable) | 低 | 安全,无锁表 |
| ADD COLUMN (NOT NULL + DEFAULT) | 中 | PG 12+ 不锁表,旧版本锁表 |
| DROP COLUMN | 高 | 确认无代码引用,先标记废弃 |
| ALTER COLUMN TYPE | 高 | 可能锁表,大表慎用 |
| ADD INDEX | 中 | 使用 CONCURRENTLY 避免锁表 |
| DROP TABLE | 极高 | 必须确认无依赖 |
Migration 模板
新增表:
-- up.sql
CREATE TABLE IF NOT EXISTS xxx (
id BIGSERIAL PRIMARY KEY,
tenant_id BIGINT NOT NULL,
-- 业务字段
name VARCHAR(255) NOT NULL,
status VARCHAR(50) NOT NULL DEFAULT 'active',
-- 审计字段
created_by BIGINT,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP
);
CREATE INDEX idx_xxx_tenant_id ON xxx(tenant_id);
CREATE INDEX idx_xxx_deleted_at ON xxx(deleted_at);
-- down.sql
DROP TABLE IF EXISTS xxx;
新增字段:
-- up.sql
ALTER TABLE xxx ADD COLUMN yyy VARCHAR(255);
-- 如果需要索引
CREATE INDEX CONCURRENTLY idx_xxx_yyy ON xxx(yyy);
-- down.sql
DROP INDEX IF EXISTS idx_xxx_yyy;
ALTER TABLE xxx DROP COLUMN IF EXISTS yyy;
数据迁移:
-- up.sql
-- 1. 先添加新字段
ALTER TABLE xxx ADD COLUMN new_field VARCHAR(255);
-- 2. 迁移数据
UPDATE xxx SET new_field = old_field WHERE new_field IS NULL;
-- 3. 添加约束(数据迁移完成后)
ALTER TABLE xxx ALTER COLUMN new_field SET NOT NULL;
-- down.sql
ALTER TABLE xxx ALTER COLUMN new_field DROP NOT NULL;
ALTER TABLE xxx DROP COLUMN IF EXISTS new_field;
大表变更策略
当表数据量 > 100 万行时:
- 添加索引:必须使用
CREATE INDEX CONCURRENTLY - 修改字段类型:分步执行(新增列→迁移数据→切换引用→删除旧列)
- 添加 NOT NULL:先添加 DEFAULT,再 SET NOT NULL
- 数据迁移:分批处理,每批 1000-10000 行
回滚检查
每个 Migration 必须有可执行的 down.sql:
- down.sql 存在且语法正确
- down.sql 可以完全撤销 up.sql 的变更
- down.sql 不会丢失业务数据(除非是 DROP TABLE)