未提供项目说明

hephaestus的Python项目详细描述


赫菲斯托斯

Build Status

简介

Hephaestus是一个静态解析SQL查询并返回AST的库。在

这对于不同的目的很有用,例如:

  • 统计信息,即使用的表或字段、连接的提示、过滤条件等
  • 部分或完全查询比较
  • 查询类型检测

SQL语法是针对Exasol的,但是可以很容易地移植它来支持其他语法。在

Hephaestus的解析器构建在Rust中,使用lalrpop板条箱来定义语法,vervolg用作SQL语法的基础。在

安装

要安装包,您需要安装nightly版本的Rust编译器:

curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain=nightly

然后直接从Github安装包:

^{pr2}$

Note: until version 0.8 of pyo3 you need to have the python binary available in your PATH; on some systems it will fail because only python3 is present. In this case install the Python 2 package.

使用

解析

Hephaestus公开了一个parse()函数,该函数给定一个SQl字符串,返回一个表示AST格式的SQl的字典:

>>>importhephaestus>>>hephaestus.parse("SELECT 1"){'_type':'SelectStatement','common':[],'expr':{'_type':'QuerySetExpression','mode':{'_type':'SelectAll'},'columns':{'_type':'ListResultColumn','values':[{'_type':'ExprResultColumn','expr':{'_type':'NumericLiteral','num':'1'},'rename':None}]},'from':[],'where_expr':None,'group_by':None},'order_by':[],'limit':None}

字典的每个节点都有一个表示节点类型的_type键,即SelectStatement,以及一系列特定于节点类型的键,这些键可以包含标量值,如strintNone,一个表示节点或标量值或节点列表的字典。在

For a full list of node types see src/ast.rs and src/ast_py.rs.

遍历

解析传入的SQL表达式只是第一步,如果没有遍历树和检查节点的能力,它就没有多大用处。在

Hephaestus提供了一个类来遍历树,并为遍历过程中遇到的每个节点调用一个方法,而不是从头开始编写代码来遍历字典嵌套结构。在

只需从Visitor类继承并实现visit_<node_type>形式的方法,其中<node_type>是{}键中节点的类型。在

此示例显示如何检查给定的SQL语句是否正在从DUAL表进行查询:

fromtypingimportDictfromhephaestus.walkimportVisitorclassMyVisitor(Visitor):has_dual_table=Falsedefvisit_NamedTableExpression(self,attr:str,node:Dict):self.has_dual_table=node["name"]==["dual"]visitor=MyVisitor("SELECT 1 FROM dual")visitor.walk()assertvisitor.has_dual_tableisTrue

当到达NamedTableExpression节点时,visit_NamedTableExpression方法被调用并接收父节点的属性名attr和节点本身。在

测试

有两组测试,一组用于Rust,另一组用于Python代码。在

Note: Unfortunately at the moment it's not possible to execute both test suites with the same Cargo.toml (looks like that the extension-module feature in pyo3 interfere with the way the tests are linked with the Rust library), so it's necessary to switch to a different config before running the them.

要运行生锈测试:

make test_rust

要运行Python测试:

make test_py

贡献

如果您想为Hephaestus项目提供帮助以扩展语法,请遵循以下步骤:

  1. 使用make rust切换到纯锈Cargo.toml
  2. src/tests中编写一个测试来覆盖这些案例
  3. 扩展src/sql.lalrpop中的语法;请参考LALR Book
  4. 将相对AST注释添加到src/ast.rs
  5. 在某些情况下,比如定义一个新的Rust枚举器,有必要添加一个从Rust类型到Python兼容类型的显式转换;在这种情况下,将相关代码添加到src/ast_py.rs

注意事项

  • 不是所有的Exasol语法都支持,大部分函数和语句都需要实现
  • 尽管parse()函数返回的AST现在可以随意操作,但是没有办法取回SQL字符串

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
jsf-java。安全NoSuchAlgorithmException:在jboss上部署时AES密钥生成器不可用   使用servlet与持久化java应用程序对话   java SPNEGO获取用户详细信息   如何向数组中的每个元素添加特定的数字?JAVA   佛教日历中的java JSpinner日期编辑器   tomcat6如何使用ip地址从另一台机器运行java动态web项目   向数据模型添加行时发生java ArrayIndexOutOfBoundsException   java奇怪的线程行为   java为什么程序没有显示任何输出?   具有弱值的java HashMap   java可以收集数据。不可修改地图是否保留原始地图?   java如何确定应用程序中的gccpu利用率?   带文本文件和比较索引的java摩尔斯电码   java第二个按钮没有响应   Maven LifecycleExecutionException java。util。ConcurrentModificationException帮助读取此堆栈跟踪/调试   java试图实现持有密钥绑定   运行时如何在Java程序中检索环境变量(外部修改)的修改值?   java可以在Gsheets数据验证下拉菜单中使用IF函数吗   java应该是抽象还是实现的一部分?