返回顶部
首页 > 资讯 > 后端开发 > Python >基于Python-sqlparse的SQL字段血缘追踪解析实现
  • 883
分享到

基于Python-sqlparse的SQL字段血缘追踪解析实现

1024程序员节数据库mysqlpythonsql 2023-09-04 16:09:02 883人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录 前言 一、字段血缘 1.区别字段 2.区别标识符序列 3.功能函数设定 二、字段血缘可视化 点关注,防走丢,如有纰漏之处,请留言指教,非常感谢 前言 sql解析和血缘追踪的研究现在差不多可以告一段落了,从8月22日写HiveSQ

目录

前言

一、字段血缘

1.区别字段

2.区别标识符序列

3.功能函数设定

二、字段血缘可视化

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢


前言

sql解析和血缘追踪的研究现在差不多可以告一段落了,从8月22日写HiveSQL源码之语法词法编译文件解析一文详解这篇文章以来便断断续续的对SQL语法解析研究,到了今天终于是有了一番成果。一般做此类研究的项目都是在数据治理和数据中台方面的服务作支撑,对于数据安全作用挺大的,多的内容我在上篇文章里面已经讲述了很多了,这里不再多提:

基于Python-sqlparse的SQL表血缘追踪解析实现,大家可以看这篇文章,接下来是接着上篇内容补充一下该功能的完善,也就是实现SQL字段血缘的解析,这是做Hive血缘或者Mysql必须完成的功能,当然实现起来也是比较麻烦的。这里主要讲一下思路和实现的步骤。


一、字段血缘

1.区别字段

字段血缘在于解析树的叶子节点的遍历,这里仍然还是使用递归就行了但是这里需要注意的一点,Function函数也会被遍历到以及表的别名和字段的别名,这两个是需要处理,如果可以的话最好将其提取出来,也有一定的解析必要。我们来看看sqlparse的解析树是如何判定这两个关键字段的:

 

 功能函数还是很好解析的,根据token的parent就可以获取Function字段,但是别名的话就不好处理,和其他字段的解析是一样的。

2.区别标识符序列

这里有两个可以递归的序列,和上次遍历表是不一样的,重点需要考虑的点在于Function和Parenthesis这两个节点都是可以递归的,上次表的遍历需要调整遍历节点,需要将这两个递归节点都要考虑进去。

3.功能函数设定

同样对于字段来说也存在着很多小问题需要处理,如重复字段,以及字段对应表如何关联,去除别名等关键函数需要处理。对于字段的层级和对应表名需要设定一个变量来记录其深度,对于SQL语句来说,如果主题功能是实现建表和插入的话1,肯定第一层语句是存在select选择字段的,那么这一层就可以解析出表的别名,再做去重剔除就好了。

二、字段血缘可视化

实现了字段以及与对应表的关联,作数据可视化也就不难了,拥有pyecharts可以帮我们快速出图。挑选例图需要考虑,对于SQLflow的这种效果还是实现需要开发一定的前端代码:

在看echart的例图中我看到了一个可以适合表达字段血缘的图表,那就是桑葚图。

做成create或者是insert as的话关系为表->表->字段的话正好合适。但是这个有个比较坑的点,就是echart的桑葚图如果字段存在重复的话将不能显示正常的图表。

大体的实现效果如下:

insert into temp.road_check_20220902select m.id as mid,m.order_id as morder_id,m.finish_time as mfinish_time,m.link_id as mlink_id,m.sid as msid,m.ctime as mctime,n.linkid as nlinkid,n.level as nlevel,n.ctime as nctime,n.sids as nsidsfrom(select        id,        order_id,        finish_time,        link_id,        sid,        from_unixtime(                cast(                        cast(    get_json_object(    split(regexp_replace(regexp_replace(frames , '\\[|\\]', ''), '\\}\\,\\{', '\\}\\;\\{'), '\\;')[0]    , '$.timestamp'    ) as bigint                        )/ 1000                 as bigint)        ,        'yyyyMMddHHmm') as ctimefrom(       select id,        order_id,        finish_time,        link_id,        sid,like,frames,dtfrom        dws_crowdsourcing.cs_order_link_mysql)where        dt = 202208)mINNER JOIN (selectlinkid ,level,from_unixtime(                cast(                        cast(    gpstime as bigint                        )/ 1000                 as bigint)        ,        'yyyyMMddHHmm') as ctime,sidsfrom track_point_traffic_dev.tk_track_traffic_info_offline where dt > '2022-08-01' and level > 3)n on m.link_id = n.linkid and m.ctime = n.ctime
if __name__ == '__main__':    table_names=[]    column_names=[]    function_names=[]    alias_names=[]    columns_rank=0    sql=get_sqlstr('read_sql.txt')        stmt_tuple=analysis_statements(sql)    for each_stmt in stmt_tuple:        type_name=get_main_functionsql(each_stmt)        #get_ASTTree(each_stmt)        blood_table(each_stmt)        blood_column(each_stmt)        column_visus()

 

当然这里还存在三重嵌套,四重嵌套。

但是表的遍历不会存在问题,那么字段的提取通过select提取出的列表也存在多个列表,这里仍然需要考虑。


点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见

来源地址:https://blog.csdn.net/master_hunter/article/details/127488487

--结束END--

本文标题: 基于Python-sqlparse的SQL字段血缘追踪解析实现

本文链接: https://lsjlt.com/news/393869.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于Python-sqlparse的SQL字段血缘追踪解析实现
    目录 前言 一、字段血缘 1.区别字段 2.区别标识符序列 3.功能函数设定 二、字段血缘可视化 点关注,防走丢,如有纰漏之处,请留言指教,非常感谢 前言 SQL解析和血缘追踪的研究现在差不多可以告一段落了,从8月22日写HiveSQ...
    99+
    2023-09-04
    1024程序员节 数据库 mysql python sql
  • 基于Python-sqlparse的SQL表血缘追踪解析实现
    目录 前言 一、主线任务 1.数据治理 2.血缘追踪 3.SQL表血缘 二、实现过程 1.目标效果 2.代码实现 1.功能函数识别 2.SQL标准格式  3.解析AST树 4.最终效果: 点关注,防走丢,如有纰漏之处,请留言指教,非常感谢 ...
    99+
    2023-09-08
    python 大数据 数据库 数据分析 hive
  • Pythonsqlparse解析SQL表血缘追踪实现
    目录引言一、主线任务1.数据治理2.血缘追踪3.SQL表血缘二、实现过程1.目标效果2.代码实现1.功能函数识别2.SQL标准格式3.解析AST树4.最终效果:引言 SQLparse...
    99+
    2024-04-02
  • sql字段解析器的实现示例
    目录1. 解题思路2. 具体解析实现3. 单元测试用例:有一段sql语句,我们需要从中截取出所有字段部分,以便进行后续的类型推断或者别名字段抽取定义,请给出此解析方法。 想来很简单吧...
    99+
    2024-04-02
  • Python实现简单的"导弹" 自动追踪原理解析
    自动追踪算法,在我们设计2D射击类游戏时经常会用到,这个听起来很高大上的东西,其实也并不是军事学的专利,在数学上解决的话需要去解微分方程, 这个没有点数学基础是很难算出来的。但是我们...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作