从sql中提取解析树
moz-sql-parser的Python项目详细描述
moz sql解析器
让我们制作一个sql解析器,这样我们就可以为非sql数据存储提供一个熟悉的接口!
Branch | Status |
---|---|
master | |
dev |
问题陈述
sql是一种常见的访问数据库的语言。虽然,每个数据库供应商都有其古怪的实现,但一般的开发人员并不知道足够多的sql来处理这些古怪的问题。这种熟悉的核心sql(如果您愿意的话,可以使用最低公分母)非常有用,足以以原始的方式探索数据。人们希望,一旦程序员用基本的sql查询检查了一个数据存储,并且他们看到了该数据的价值,他们就会有动机使用数据存储的本机查询格式。
目标
这个库的主要目标是将SQL-92查询的某些子集转换为json可解析树。一个足够大的子集,可以通过sql提供表面的数据访问,但不能像处理文档关系阻抗不匹配那样多。
非目标
- 没有计划提供更新语句,比如
update
或insert
- 没有计划将该语言扩展到所有SQL:2011
- 没有计划提供数据访问工具
项目状态
有over 400 tests。这个解析器非常适合基本使用,包括内部查询。
当使用activedata数据源时,您可以在https://sql.telemetry.mozilla.org/处看到解析器正在工作
安装
pip install moz-sql-parser
用法
>>> from moz_sql_parser import parse
>>> import json
>>> json.dumps(parse("select count(1) from jobs"))
'{"select": {"value": {"count": 1}}, "from": "jobs"}'
每个sql查询都被解析为一个对象:每个子句都被赋给一个同名的对象属性。
>>> json.dumps(parse("select a as hello, b as world from jobs"))
'{"select": [{"value": "a", "name": "hello"}, {"value": "b", "name": "world"}], "from": "jobs"}'
SELECT
子句是包含name
和value
属性的对象数组。
运行测试
有关运行测试或编写新测试的说明,请参见the tests directory。
有关实现的详细信息
sql查询被转换为json对象:每个子句都被分配给一个同名的对象属性。
# SELECT * FROM dual WHERE a>b ORDER BY a+b
{
"select": "*",
"from": "dual",
"where": {"gt": ["a", "b"]},
"orderby": {"value": {"add": ["a", "b"]}}
}
表达式也是对象,但只有一个属性:操作的名称,以及该操作的参数值(数组)。
{op: parameters}
您可以在前面的示例中看到这种模式:
{"gt": ["a","b"]}
注释
- 使用光荣的
pyparsing
库(请参见https://github.com/pyparsing/pyparsing)定义语法,并定义生成的标记的形状。 - sqlparse不提供树,而是提供令牌列表。