【问题标题】:Pypika: Is it possible to dynamically change the operator in where clausePypika:是否可以在 where 子句中动态更改运算符
【发布时间】:2025-12-30 04:45:16
【问题描述】:

我正在使用 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 库添加标签

【问题讨论】:

    标签: python sql pypika


    【解决方案1】:

    我看到您在大约 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.
    

    希望这会有所帮助!

    【讨论】: