PHP需用sql-parser解析SQL提取表依赖并输出标准JSON图谱数据,再交由vis.js等前端库渲染;正则匹配易漏子查询、CTE等结构,而外键元数据无法覆盖动态SQL等逻辑依赖。

PHP 本身不直接生成可视化血缘图谱,它只负责解析 SQL、提取表依赖关系并输出结构化数据(如 JSON);真正绘图必须交给前端 JS 库(如 vis.js、Cytoscape.js 或 Mermaid)。
如何从 SQL 中准确提取 FROM 和 JOIN 表名
很多 PHP 脚本简单用正则匹配 FROM\s+(\w+),但会漏掉子查询、CTE、反引号包裹的表名、数据库前缀(db.table)、别名后的实际表名。正确做法是:用 sql-parser 这类轻量语法解析器(非正则),它能识别嵌套结构。
- 安装:
composer require phpmyadmin/sql-parser - 对每个 SQL 语句调用
Parser::parse(),遍历$stmt->base_table和所有$stmt->join_tables的table字段 - 注意过滤掉临时表(
tmp_*)、视图(需额外判断是否为真实表)、以及INSERT INTO ... SELECT中的源表而非目标表
如何构建可被前端渲染的依赖关系 JSON
前端图谱库需要的是节点(表)和边(依赖方向)组成的图数据。PHP 不该拼 HTML 或 SVG,只输出标准 JSON:
{
"nodes": [
{"id": "users", "label": "users"},
{"id": "orders", "label": "orders"}
],
"edges": [
{"from": "users", "to": "orders", "label": "FK_user_id"}
]
}-
nodes去重:同一张表在多个 SQL 中出现,只保留一个节点 -
edges要带方向:FROM orders JOIN users表示orders → users(orders 依赖 users),不是反过来 - 避免自环:排除
FROM t1 JOIN t1这类无效边 - 可选加权重字段(如引用次数),供前端控制边粗细
为什么不能直接用 PDO::query() 查 INFORMATION_SCHEMA 代替 SQL 解析
查元数据只能拿到外键约束(KEY_COLUMN_USAGE),但真实依赖远不止外键:SELECT 中的跨库 JOIN、UNION ALL 合并不同表、存储过程中动态拼接的表名、甚至硬编码字符串中的表名("SELECT * FROM ".$table)——这些都逃不过 SQL 解析。
立即学习“PHP免费学习笔记(深入)”;
- 外键缺失很常见:数仓宽表、ETL 中间表、历史遗留表往往无外键
-
INFORMATION_SCHEMA不包含应用层 SQL 的逻辑依赖,只反映物理约束 - 混合使用时,建议以 SQL 解析为主,外键信息为辅(用于补全未出现在 SQL 中但有约束的关联)
真正难的不是 PHP 提取依赖,而是处理 SQL 变体:Laravel 的 Query Builder 生成的 SQL 格式不统一、MyBatis 的 XML 中 <foreach></foreach> 动态表名、Python 脚本里用 f-string 拼的 SQL —— 这些都需要前置标准化或定制解析规则。别指望一个通用正则能跑通所有业务代码库。



















