6

我正在为从 SQL 和其他来源提取数据的数据库构建查询引擎。对于正常用例,用户可以使用 Web 表单,用户可以使用选择和范围输入指定过滤参数。但是对于高级用例,我想指定一个过滤方程框,用户可以在其中键入

  • 和,或

  • 嵌套括号

  • 变量名

  • , <, =, != 运算符

所以过滤方程可能看起来像:

 ((age > 50) or (weight > 100)) and diabetes='yes'

然后将解析此输入,检测输入错误(不存在的变量名称等)并基于它构建 SQL Alchemy 查询。

我之前看到过一篇关于类似问题的帖子https://stackoverflow.com/a/1395854/315168

Python http://navarra.ca/?p=538似乎存在几种语言和迷你语言解析器

但是,是否存在针对我的问题的开箱即用解决方案或接近解决方案的任何软件包?如果不是,那么在 Python 中构造此类查询解析器和构造函数的最简单方法是什么?

4

2 回答 2

1

看看https://github.com/dfilatov/jspath

它类似于 xpath,因此语法不像 SQL 那样熟悉,但它对分层数据具有强大的功能。

于 2014-06-10T01:13:41.463 回答
1

我不知道这是否仍然与您相关,但这是我的答案:

首先,我创建了一个完全符合您需要的类。您可以在这里找到它: https ://github.com/snow884/filter_expression_parser/ 它采用字典列表作为输入 + 过滤器查询并返回过滤后的结果。您只需定义允许的字段列表以及用于检查作为过滤器表达式的一部分传递的常量的格式的函数。

它摄取的过滤器表达式必须具有以下格式:

(时间 > 45.34) OR (((user_id eq 1) OR (date gt '2019-01-04')) AND (username ne 'john.doe'))

要不就

用户名 ne 'john123'

其次,我什至创建此代码是愚蠢的,因为来自 pandas 的 dataframe.query(...) 已经几乎完全满足了您的需求:https ://pandas.pydata.org/pandas-docs/stable/reference/api/ pandas.DataFrame.query.html

于 2019-02-24T19:34:52.850 回答