用途:审查 Django 迁移文件是否符合 Prowler 特定的 PostgreSQL 最佳实践。触发场景包括创建新迁移、运行 makemigrations 或 pgmakemigrations、审查新增或修改迁移的 PR,以及向数据库添加索引、约束或模型。
主要能力与规则:
- 拆分自动生成的迁移。makemigrations 会把 CreateModel、AddIndex、AddConstraint 打包进一个文件,需按关注点拆分:CreateModel 与 AddConstraint 同属结构变更放一起;AddIndex 单独成文件;分区表索引拆为两步。
- 索引与建表分离。CreateModel + AddConstraint 同一迁移,AddIndex 单独迁移,避免索引失败回滚建表。
- 每张表的索引各自一个迁移文件,禁止在一个迁移中混用不同 model_name 的 AddIndex。
- 分区表(findings、resource_finding_mappings)索引需两步:先用 api.db_utils 的 create_index_on_partitions 并设 atomic = False(CREATE INDEX CONCURRENTLY 不能在事务内运行),再单独用 AddIndex 在父表注册。
- 大表索引可先 --fake 迁移,再在低峰期手动执行 CREATE INDEX CONCURRENTLY,最后在父表注册。
- 数据回填禁止内联,迁移只派发 Celery 任务,任务按租户分批处理,每批一个 rls_transaction,使用 bulk_create/bulk_update 并设 batch_size=500,读取用 iterator() 与 only()/values_list(),逐项捕获失败并记录总数。
使用方式:按决策树判断迁移类型,逐条对照规则审查,输出违规项(含规则编号与说明)、修正后的迁移文件,分区表需同时给出分区与父表迁移。若全部通过则明确说明。可配合 Context7 MCP 查询 Django 5.1 文档。
限制:该技能针对 Prowler 项目与 PostgreSQL,其他项目或数据库未必适用;具体命令与辅助函数以资料为准,未提供的细节暂未提供。