如何在SonarQube中获取项目各文件的Bug数量?求SQL查询方案
获取SonarQube项目中每个文件的Bug数量
我之前在做SonarQube数据统计时也碰到过这个需求,一开始误以为要从projects_measures表入手,后来才搞清楚——这个表其实是用来存储项目/模块级别的聚合度量(比如整个项目的总Bug数),如果要拿到单个文件的Bug数量,得靠projects、files(或老版本的components)和issues这三个核心表的关联来实现。
核心关联逻辑
先理清楚关键表的作用和关联关系:
projects:存储项目的基础信息,id是项目的唯一主键files(SonarQube 8.x+):存储项目下的所有文件,project_id关联projects.id,uuid是文件的唯一标识components(SonarQube 7.x及以下):老版本中用来存储所有组件(包括文件、模块等),需要用qualifier = 'FIL'筛选出文件类型的记录issues:存储所有代码问题(Bug、漏洞、代码异味等),component_uuid关联文件的uuid,type字段用来区分问题类型(BUG就是我们要统计的Bug)
适用不同版本的SQL语句
适用于SonarQube 8.x及以上版本
SELECT p.name AS project_name, f.file_path AS file_path, COUNT(i.id) AS bug_count FROM projects p JOIN files f ON p.id = f.project_id LEFT JOIN issues i ON f.uuid = i.component_uuid AND i.type = 'BUG' WHERE p.name = '你的目标项目名称' -- 替换为实际项目名,也可以用p.id指定项目ID GROUP BY p.name, f.file_path ORDER BY bug_count DESC;
适用于SonarQube 7.x及以下版本
老版本没有单独的files表,需要从components中筛选文件:
SELECT p.name AS project_name, c.path AS file_path, COUNT(i.id) AS bug_count FROM projects p JOIN components c ON p.id = c.project_id AND c.qualifier = 'FIL' -- 只保留文件类型的组件 LEFT JOIN issues i ON c.uuid = i.component_uuid AND i.type = 'BUG' WHERE p.name = '你的目标项目名称' GROUP BY p.name, c.path ORDER BY bug_count DESC;
额外的过滤技巧
如果需要更精准的统计,可以添加额外条件:
- 只统计未修复的Bug:在
LEFT JOIN或WHERE中加入i.status = 'OPEN'(具体状态值可根据你的SonarQube版本调整) - 按Bug严重程度筛选:加入
i.severity = 'CRITICAL'或i.severity = 'MAJOR'等
内容的提问来源于stack exchange,提问作者Ankit Patel
相关产品推荐
相关产品推荐

