我想在非关系数据存储上创建一个SQL接口.非关系数据存储,但以关系方式访问数据是有意义的.

我正在研究使用ANTLR生成一个AST,它将SQL表示为一个关系代数表达式.然后通过判断/遍历树返回数据.

我以前从未实现过语法分析器,因此我想了解一些关于如何最好地实现SQL语法分析器和计算器的建议.

  • 上述方法听起来正确吗?
  • 是否还有其他工具/库需要我研究?比如PLYPyparsing.
  • 如能提供能帮助我的文章、书籍或源代码,我将不胜感激.

Update:

我使用pyparsing实现了一个简单的SQL解析器.结合对我的数据存储实现关系操作的Python代码,这相当简单.

正如我在其中一条 comments 中所说,这项工作的目的是让数据可供报告引擎使用.为此,我可能需要实现一个ODBC驱动程序.这可能需要做很多工作.

推荐答案

我对这个问题进行了广泛的研究.Python sqlparse是一个非验证解析器,这并不是您真正需要的.antlr中的示例需要大量工作才能在python中转换为漂亮的ast.sql标准语法是here个,但是自己转换它们是一项全职工作,很可能只需要它们的一个子集,即不需要连接.您也可以try 查看gadfly(一个python sql数据库),但我避开了它,因为它们使用自己的解析工具.

就我而言,我只需要一个where子句.我try 了用pyparsing编写的booleneo(一个布尔表达式解析器),但最终还是从头开始使用pyparsing.Mark Rushakoff的reddit帖子中的第一个链接给出了一个使用它的sql示例.Whoosh全文搜索引擎也使用它,但我还没有查看源代码以了解如何使用.

Pyparsing非常易于使用,您可以非常轻松地对其进行自定义,使其与sql不完全相同(大多数语法您都不需要).我不喜欢ply,因为它使用了一些使用命名约定的魔法.

简言之,试一试pyparsing,它很可能强大到足以满足您的需要,与python的简单集成(具有简单的回调和错误处理)将使体验非常轻松.

Sql相关问答推荐

PostgreSQL行级锁

神秘的日期转换

如何计算帐户在SQL中随着时间的推移购买的SKU数量?

按postquist中的日期查询json列

GROUP BY与多个嵌套查询T—SQL

如何在Snowflake SQL存储过程中传递LIMIT和OFFSET的参数?

我可以将INSERT语句与SELECT一起使用来创建条件吗?

SQL将 Select 查询作为新列添加到另一个 Select 查询

在Oracle中,如何删除具有特定值的行,仅当它是重复的行?

我怎样才能得到列值对应的最大值在另一个?

排除具有部分匹配条件的记录

如何使子查询在UPDATE语句期间获得最新更新

SQL按组 Select 最小值,当值不存在时为Null

PostgreSQL中递归CTE查询的故障过滤

如何使用SQL生成数据的滚动3天总和

BigQuery导航函数计算ID

正则表达式:停在第一个匹配的其中一个字符位置上

如何通过CROSS APPLY获取多级嵌套JSON属性的值?

joins 组合多个重复数据删除策略

忽略与给定列匹配的行的 LAG 函数