**
目的:
**
分析mysql的表级和字段级血缘,本文给出他人源码或示例
工具
GUDU-SQLPARSER GSP
JSQL-PARSER
antlr
DRUID
横向对比
名称 | 开源 | 功能 | 优点 | 缺点 | 支持的数据库 | 官网 | |
---|---|---|---|---|---|---|---|
GUDU-SQLPARSER GSP | 商业,SDK免费 | 强大,有sqlflow商业产品背书 | 功能强大,傻瓜式一键解析血缘 | 无法使用开源 | all | https://www.sqlparser.com/download.php | |
JSQL-PARSER | 是 | 挺强大,但要自行实现 | 给了一些封装的内容,剩下的要自己写 | 还是需要自己写的 | 多数 | https://github.com/JSQLParser/JSqlParser | |
antlr | 是 | 提供语义包,需要自己实现visitor解析 | 只给了语义包,处理都需要自己写,语义细腻 | 语义解析过度复杂,每个语义包是一套代码 | 都支持,但不同语义包 | https://www.antlr.org | |
DRUID | 是 | ||||||
商业参考 | |||||||
http://www.sqllineage.com/demo#services |
其他工具:
PY的SQL-LINEAGE,缺点无法识别RS
https://github.com/reata/sqllineage
名词解释
血缘:当你在数据库里执行一段SQL代码后,数据库会返回给你一个结果集(record set,简称RS),结果集中的每一列可能来源于不同的表,这些不同的表又依赖别的表,中间可能经过了函数、聚合等计算。源表与结果集关系,就是血缘关系。
RS:result set:结果集,结果所合并的表
GUDU-SQLFlow的几种关系
fdd:表示数据从源列到目标列的关系
frd:表示结果集返回数量受到源列影响
fdr:表示目标列的值受到源列数据集数量的影响
join:表示SQL的多表join关系
原理
基于antlr4实现hiveSQL的解析[表血缘和字段血缘]
http://ganjiacheng.cn/article/2020/article_14_%E5%9F%BA%E4%BA%8Eantlr4%E5%AE%9E%E7%8E%B0HQL%E7%9A%84%E8%A7%A3%E6%9E%90-%E8%A1%A8%E8%A1%80%E7%BC%98%E5%92%8C%E5%AD%97%E6%AE%B5%E8%A1%80%E7%BC%98/
访问者模式及其在 Java Parser 中的应用
https://xie.infoq.cn/article/5f80da3c014fd69f8dbe09b28
Open Source SQL Parsers
https://tokern.io/blog/open-source-sql-parsers/
【SQL解析】- SQL血缘分析实现篇01
https://blog.csdn.net/qq_31557939/article/details/126277212
示例
GUDU GSP
调用generateDataFlow()方法即可获取字段级血缘
private static void xml(String sql){
DataFlowAnalyzer dlineage = new DataFlowAnalyzer(sql, EDbVendor.dbvmysql, false);
dlineage.generateDataFlow();
String result = XML2Model.saveXML(dlineage.getDataFlow());
System.out.println(result);
}
参考文章
https://blog.csdn.net/chensuper/article/details/125985342
SQLFlow的几种关系
https://blog.51cto.com/u_15162069/2780724
SQLFlow:在线解析SQL血缘关系(SQL Data Lineage)
https://blog.csdn.net/woshihanhan1/article/details/116562306
JSQL PARSER
表级
逻辑:调用方法getTableList获取所有表后,再根据语句获取目标表,排除目标表即为源表
官方示例
https://jsqlparser.sourceforge.net/example.php
Statement statement = null;
try {
statement = CCJSqlParserUtil.parse(sql);
} catch (JSQLParserException e) {
throw new RuntimeException(e);
}
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
List<String> all = tablesNamesFinder.getTableList(statement);
字段级
参考仓库
https://github.com/luop23/sql_analysis
ANTLR MYSQL/HIVE
表级,字段级都参考
基于antlr4实现hiveSQL的解析[表血缘和字段血缘]
http://ganjiacheng.cn/article/2020/article_14_%E5%9F%BA%E4%BA%8Eantlr4%E5%AE%9E%E7%8E%B0HQL%E7%9A%84%E8%A7%A3%E6%9E%90-%E8%A1%A8%E8%A1%80%E7%BC%98%E5%92%8C%E5%AD%97%E6%AE%B5%E8%A1%80%E7%BC%98/
参考仓库
https://github.com/webgjc/sql-parser
相关参考
ANTLR语义包mysql
https://github.com/antlr/grammars-v4/tree/master/sql/mysql/Positive-Technologies
使用antlr快速解析SQL
https://blog.51cto.com/u_2837193/4904003
antlr4入门 SQL解析
https://www.bilibili.com/read/cv16868467/
从定义到AST及其遍历方式,一文带你搞懂Antlr4
https://zhuanlan.zhihu.com/p/347329881
使用antlr快速解析SQL
https://blog.csdn.net/puhaiyang/article/details/122161809
Antlr4解析MySQL语法使用方法
https://www.jianshu.com/p/df256de737b4
Antlr v4入门教程和实践
https://blog.csdn.net/yixianshijie/article/details/121496250
HIVE
https://github.com/JunNan-X/HiveSqlBloodFigure
DRUID
参考仓库
https://github.com/L11168032/sql-lineage-parser
https://github.com/JupiterMouse/data-lineage-parent