# druineage **Repository Path**: check_null/druineage ## Basic Information - **Project Name**: druineage - **Description**: 解析SQL语句,分析血缘。不是table-table的关系,是column-column关系。 - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 15 - **Forks**: 1 - **Created**: 2019-12-08 - **Last Updated**: 2024-09-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: 血缘, SQL, durid ## README # Druineage ## 描述 解析SQL语句,分析血缘。不是table-table的关系,是**column-column**关系。 ## 版本历史记录 0.5.3 * 解析血缘时记录源sql 0.5.2 * 修正解析case when...in (...) then...时,in中的内容不应解析为“数据”,应该解析为“判断条件”。 0.5.1 * 在解析create...as select ...union all...时,强制先解析第一个select。 0.5.0 * 在替换"\*"时尽量保证替换在"\*"原来的位置,并且替换时尽量保证不"换多" 0.4.9 * 舍去部分功能,减轻核心负担(完全可以使用后自行结果调整) > * 强制转换为大写后解析 > * 取消是否展示未知字段开关,使用标识代替 > * 去除清理中间表开关(可以解析结果之后再清理) * "\*"逆推时,过滤外部的常量字段 * 优化case when中的null过滤规则 * 函数多层嵌套时,计算血缘作用 0.4.8 * case when中的is null和is not null的null不作为血缘 * 不支持的*仅提示,不停断 * 完善支持一表多血缘 * 优化代码 0.4.7 * 支持子查询无别名 * 支持子查询中常量字段无别名 0.4.6 * 优化字段功能标记逻辑 > * 数据(外部)+数据(内部) -> 数据 > * 数据(外部)+判断(内部) -> 判断 > * 数据(外部)+数据,判断(内部) -> 数据,判断 > * 判断(外部) -> 判断 > * 数据,判断(外部)+数据(内部) -> 数据,判断 > * 数据,判断(外部)+判断(内部) -> 判断 > * 数据,判断(外部)+数据,判断(内部) -> 数据,判断 * 重新整理部分特殊函数 * 屏蔽dbType=oracle时’’转null的情况 0.4.5 * 血缘字段全展示,并且标记用途(判断还是数据) * 解析结果去重 0.4.4 * 目标表常量血缘字段全展示 0.4.3 * 修正目标表常量血缘字段展示,并且仅无变量字段才展示常量 0.4.2 * 目标表支持常量血缘字段展示 0.4.1 * 修正了同级多次使用同一张表导致的bug 0.4.0 * 支持同表内外使用多次 ## 使用 _只有一个功能_ ```java DB db = new Lineage(数据库类型) .setUnknownColumnPrefix(未知字段前缀) //默认:UNKNOWN_ .setColumnFilter(自定义字段过滤器) .analysis(sql语句); //sql语句可为String、String[]、Collection ``` ## 规范(局限) ### 全局 > * 尽量不要用“*” > * 如果字段不参与血缘,尽量不要被“count”,尽量用“count(*)” > * 所有字段格式(尽量):别名.字段名 > * 尽量设置数据库类型 ### select * 绝对不要嵌“子查询” ### from * 所有表格式:schema.表名 [as] 别名 > * 所有表尽量有“别名” > * 有schema的一定要加schema * 子查询即使是内外嵌套,别名最好也不要相同 * 关联查询尽量用“join”,不用其他 ### create * create table schema.表名 [(字段名[,…])] as select … > as必须得加 ### insert * insert into schema.表名 [(字段名[,…])] select … > select前的字段可不加 ### 注 > * 默认drop语句表示该表是临时表,最终血缘中不予以展示 > * 本工具解析sql的读取功能使用druid实现,所以解析血缘的前提是sql能被druid读取,druid读取出错,就别提下一步解析了。 > * 事实上create规范中as必须加中也是druid的要求。 > * 有些注释方式跟数据库类型有关