繁体   English   中英

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

[英]Parsing and constructing filtering queries similiar to SQL WHERE clause in Python/JavaScript

我正在为数据库构建一个查询引擎,该数据库从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中构造这样的查询解析器和构造函数的最简单方法是什么?

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

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

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

首先,我创建了一个完全符合您需求的类。 您可以在此处找到它: 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM