【问题标题】:SQLALchemy dynamic filter_bySQLALchemy 动态 filter_by
【发布时间】:2015-07-05 07:46:31
【问题描述】:

我知道您可以通过将**kwargs 提供给filter_by 来为SQLAlchemy 查询构建动态过滤器。

例如

    filters = {'id': '123456', 'amount': '232'}
    db.session.query(Transaction).filter_by(**filters)

下面是我的问题:

如果我需要通过“大于”或“小于”子句进行查询怎么办? 例如(原始 SQL):

 select * from transaction t 
 where t.amount > 10 and t.amount < 100;

【问题讨论】:

    标签: python orm sqlalchemy


    【解决方案1】:

    我建议不要使用filter_by,而是使用filter,它为您提供了更多选择。

    例如(来自手册):

    db.session.query(MyClass).filter(
        MyClass.name == 'some name',
        MyClass.id > 5,
    )
    

    关于你的情况:

    filters = (
        Transaction.amount > 10,
        Transaction.amount < 100,
    )
    db.session.query(Transaction).filter(*filters)
    

    【讨论】:

    • 我们是否有机会制作您提到的过滤器列表,但运算符将用占位符动态填充,例如:op = "&gt;=" value=10 filter1 = "f{Transaction.amount} {op} {value}" filters =( filter1) db.session.query(Transaction).filter(*filters)
    • @Wolph:我也会感谢你的回答
    • @JavaSa 所有运算符都可以通过 Python 中的 operator 模块使用。所以除了a &gt;= b,你也可以使用operator.ge(a, b)
    【解决方案2】:
    def get_filter_by_args(dic_args: dict):
        filters = []
        for key, value in dic_args.items():  # type: str, any
            if key.endswith('___min'):
                key = key[:-6]
                filters.append(getattr(model_class, key) > value)
            elif key.endswith('___max'):
                key = key[:-6]
                filters.append(getattr(model_class, key) < value)
            elif key.endswith('__min'):
                key = key[:-5]
                filters.append(getattr(model_class, key) >= value)
            elif key.endswith('__max'):
                key = key[:-5]
                filters.append(getattr(model_class, key) <= value)
            else:
                filters.append(getattr(model_class, key) == value)
        return filters
    
    dic_args = {
        'is_created': 1,
        'create_time__min': 1588125484029,
    }
    filters = get_filter_by_args(dic_args)
    lst = session.query(model_class).filter(*filters)
    

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 2011-01-08
      • 2019-08-18
      • 2021-02-24
      • 2020-07-30
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多