| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 【python】使用Antlr4实现识别sql中的表或视图名 -> 正文阅读 |
|
[大数据]【python】使用Antlr4实现识别sql中的表或视图名 |
前言先上成果预览图吧 作为一个数据库sql开发者,肯定有很多人和我一样,想要有一个工具,能传入任意sql,解析出sql中的所有表。 antlr4 https://github.com/antlr/antlr4 Antlr这个老早就有了,如今已经比较成熟,像代码高亮插件prism就是用的这个。 首先,翻了很多文章,了解了Antlr4本身是个java程序,定义为解析器生成程序,而不是解析器本身。
而理论上,Antlr4能解析的语法是无穷的,因为它本身并不带解析规则,解析规则完全依靠g4文件。 所以为了配合Antlr4,这个作者开了个项目,让大家都来写各种语言的g4文件 管他三七二十一,先把这两个项目的代码都下载下来。 操作步骤(windows)第1步,安装java jdk1.7版本以上,已安装请略过,前面说过了,Antlr4是java编写的解析器程序的生成程序,要运行java就得安装java,官方地址 第2步,下载Antlr4地址 https://www.antlr.org/download/ 建一个项目文件夹,我这里命名为 d:\sql_table, 第3步,设置环境变量在系统环境变量中,添加 CLASSPATH 指向 d:\sql_table\antlr-4.9.2-complete.jar 第4步,下载并安装Antlr4的runtime下载Antlr4的整个库
第5步,获得plsql的语法文件下载grammars-v4的整个库
第6步,生成解析器程序打开cmd,定位到我们的项目目录 d:\sql_table
运行后,目录内会生成以下几个文件
至此,原材料才算准备齐全,接下来开始使用这个东西 第7步,测试在刚刚解压的Antlr4\runtime\python3\bin目录下,有个pygrun文件,是用python语言编写的,把这个文件复制到我们的项目目录 d:\sql_table ,
然后再输入一个sql,注意必须都大写, 比如
再 ctrl+z,回车 这里提几点,
这个开始规则传什么,我研究了不少时间,它来源于PlSqlParser.g4文件中,一开始我想的是我要找from后面的表,就传了个from_clause,结果没识别出来,然后我又换成query_block,才识别出来,中间还被sql的大小写坑了,但是我换了个例子,用WITH开头的sql,又识别不出来了。仔细看这个PlSqlParser.g4文件的内容,是分一段一段的,其中有一段这个
query_block作为一个开始规则,同时出现在了subquery_basic_elements下面,是不是代表这个是包含关系?
把sql_script带进去,没错了,只是速度会比之前用query_block更慢,但这样兼容性更高 另外,这个pygrun有更新版本,支持界面显示树,加上 -g 参数即可,下载在这里 有了这个例子,我们就要看怎么把我们要的东西挑出来了 第8步,编写获取表名的程序这里提一个名词 ,叫 面向对象编程, 之前看python教程的时候不觉得咋样,这次是真被折磨了,如果懂java的估计早就习惯了,但我纯自己写java实在太少,属于那种能查问题但不会写的。这个解析器里面用了好多自定义类,进去是啥知道,要不是开了源,压根就不知道出来的是啥,也不知道它有哪些方法(虽然用命令可查,但是我习惯了“记事本编程”,没有一边查定义一边编程的习惯),所以参考它这个带界面的那段程序,是一行一行写进去的,我们不需要界面,只需要知道怎样循环它,怎样拿它的值就行了,说这些,我肯定被java大佬鄙视了吧,这里python的逻辑和java太像了。。。 根据这个界面分析,拿着原始sql,一个个位置数,看哪些关键字用得上。 分析到这里,
直接运行,就得到了本文最开始的那个效果。 有两行注释掉了,可以切换传入文件名 完整程序包已完成新建文件夹,最近天气不好,有点累,休息一下,以后再弄 我打算把整个过程需要用到的文件,包括安装命令,封一个包出来,然后程序也封装成一个函数,输入文件或者字符串返回结果,另外加上那个自动转换成dblink的功能,再让这个程序兼容在oracle中使用,就完美了。 另外java版本的制作方式也极其类似,只多了一步,在生成解析器程序后,要用javac命令编译生成的解析器程序,我本地已测试成功,大佬们应该比我会玩,就不多说了 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 1:26:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |