解析和构造类似于Python / JavaScript中的SQL WHERE子句的过滤查询

问题描述 投票:4回答:2

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

  • 和,或
  • 嵌套括号
  • 变量名
  • ,<,=,!=运营商

因此,过滤方程式可能如下所示:

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

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

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

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

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

javascript python sqlalchemy bnf
2个回答
1
投票

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

它与xpath类似,因此语法不像SQL那么熟悉,但它比分层数据更强大。


1
投票

我不知道这是否与你有关,但这是我的答案:

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

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

(时间> 45.34)或(((user_id eq 1)OR(日期gt'2019-01-04'))AND(用户名ne'john.doe'))

要不就

用户名ne'john123'

其次,我甚至创建这个代码是愚蠢的,因为来自pandas的dataframe.query(...)已经几乎完全符合你的需要:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html

© www.soinside.com 2019 - 2024. All rights reserved.