当前位置: 首页 > 工具软件 > jSQL > 使用案例 >

mysql血缘 表级血缘 字段级血缘GUDU GSP,JSQL PARSER,ANTLR MYSQL,DRUID

西门威
2023-12-01

**

目的:

**
分析mysql的表级和字段级血缘,本文给出他人源码或示例

工具

GUDU-SQLPARSER GSP
JSQL-PARSER
antlr
DRUID

横向对比

名称开源功能优点缺点支持的数据库官网
GUDU-SQLPARSER GSP商业,SDK免费强大,有sqlflow商业产品背书功能强大,傻瓜式一键解析血缘无法使用开源allhttps://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

 类似资料: