Pypika:是否可以动态更改 where 子句中的运算符

Pypika: Is it possible to dynamically change the operator in where clause

我正在使用 Pypika 查询 HDB。通常我会创建查询,然后添加这样的 where 子句:

query = query.where(table.ID == value)

现在我遇到了不知道将使用哪个运算符的情况。我可以是任何可能的运营商:

['==', '<>', '<', '>', '<=', '>=']

有没有办法动态指定Pypika的运算符?目前我正在这样做:

if operator == '<=':
        query = query.where(table.ID == value)
elif operator == '>=':
    ...

但我想做这样的事情:

operator = '=='
query = query.where(table.ID {operator} value)

感谢任何意见!

PS: 不确定你在这里是不是这样做的:也许有更多积分的人可以为 Pypika 库添加一个标签

我看到您是在大约 30 天前发布的,所以我希望您在此期间找到了解决方案。但是,如果你还没有 - 我 运行 遇到了同样的问题,以下对我有用:编写一个函数,从 operator 模块中获取一个运算符,并生成查询:

from pypika import Table, Field, Query
from typing import List, Callable
import operator


def gen_my_query(varname: str, 
             my_operator: Callable, 
             permitted_value: int, 
             my_table: str, 
             selected_vars: List[str]):

    my_query = Query.from_(Table(my_table)
                          ).select(','.join(selected_vars)
                          ).where(
                                  my_operator(Field(varname), permitted_value)
                          ).get_sql(quote_char=None)

    return my_query

函数可以这样使用:

gen_my_query(varname='id', 
             my_operator=operator.eq, 
             permitted_value=1, 
             my_table='table', 
             selected_vars=["var1", "var2", "var3"])

产生以下结果:

'SELECT var1,var2,var3 FROM table WHERE id=1'

如果您想继续使用定义为字符串的运算符,您可以例如在字典中定义一个映射并重构上面的函数以从字典中获取正确的运算符,例如:

my_operators = {'==': operator.eq,
                '<': operator.le} # ... etc.

希望对您有所帮助!