首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pypika:是否可以动态更改where子句中的运算符

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

Stack Overflow用户
提问于 2020-01-02 20:01:53
回答 1查看 1K关注 0票数 2

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

代码语言:javascript
复制
query = query.where(table.ID == value)

现在我有一个情况,我不知道将使用哪个运算符。我可以是任何可能的运算符:

代码语言:javascript
复制
['==', '<>', '<', '>', '<=', '>=']

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

代码语言:javascript
复制
if operator == '<=':
        query = query.where(table.ID == value)
elif operator == '>=':
    ...

但我想这样做:

代码语言:javascript
复制
operator = '=='
query = query.where(table.ID {operator} value)

感谢您的任何意见!

PS:不确定这是否是你在这里做的:也许有更多分数的人可以为Pypika图书馆添加一个标签

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-01 20:44:39

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

代码语言:javascript
复制
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

该函数的使用方法如下:

代码语言:javascript
复制
gen_my_query(varname='id', 
             my_operator=operator.eq, 
             permitted_value=1, 
             my_table='table', 
             selected_vars=["var1", "var2", "var3"])

这将产生以下结果:

代码语言:javascript
复制
'SELECT var1,var2,var3 FROM table WHERE id=1'

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

代码语言:javascript
复制
my_operators = {'==': operator.eq,
                '<': operator.le} # ... etc.

希望这能有所帮助!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59563038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档