feat(skill): REQ-20260406-0004 技能三层分离重构(7主线+16插件)
批次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>
This commit is contained in:
105
skills-dev/db-migration-plugin/skills/SKILL.md
Normal file
105
skills-dev/db-migration-plugin/skills/SKILL.md
Normal file
@@ -0,0 +1,105 @@
|
||||
---
|
||||
name: db-migration
|
||||
description: 数据库变更方案插件。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 模板
|
||||
|
||||
**新增表**:
|
||||
```sql
|
||||
-- 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;
|
||||
```
|
||||
|
||||
**新增字段**:
|
||||
```sql
|
||||
-- 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;
|
||||
```
|
||||
|
||||
**数据迁移**:
|
||||
```sql
|
||||
-- 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 万行时:
|
||||
|
||||
1. **添加索引**:必须使用 `CREATE INDEX CONCURRENTLY`
|
||||
2. **修改字段类型**:分步执行(新增列→迁移数据→切换引用→删除旧列)
|
||||
3. **添加 NOT NULL**:先添加 DEFAULT,再 SET NOT NULL
|
||||
4. **数据迁移**:分批处理,每批 1000-10000 行
|
||||
|
||||
## 回滚检查
|
||||
|
||||
每个 Migration 必须有可执行的 down.sql:
|
||||
- [ ] down.sql 存在且语法正确
|
||||
- [ ] down.sql 可以完全撤销 up.sql 的变更
|
||||
- [ ] down.sql 不会丢失业务数据(除非是 DROP TABLE)
|
||||
Reference in New Issue
Block a user