【问题标题】:Parsing and constructing filtering queries similiar to SQL WHERE clause in Python/JavaScript解析和构造类似于 Python/JavaScript 中的 SQL WHERE 子句的过滤查询
【发布时间】:2023-03-21 21:52:01
【问题描述】:

我正在为从 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 中构造此类查询解析器和构造函数的最简单方法是什么?

【问题讨论】:

标签: javascript python sqlalchemy bnf


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    或者只是

    用户名 'john123'

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      相关资源
      最近更新 更多