SQLAlchemy ORM / Python:仅当搜索值不为None时,才包含查询过滤器的单行(内联'if')

我可以在Python级别上实现内联if吗?

让我们来看看这种(简化的)情况:

# DB-level 'or'
db.session.query(Tableclass).filter(or_(Tableclass.column_1 == value_1,Tableclass.column_2 == value_2)).first()

# basic Python-level 'if'
if value_1:
    db.session.query...value_1
if value_2:
    db.session.query...value_2

除了像上面那样查询数据库或添加其他if语句外,还可以通过以下方式实现相同的内联

# desired inline Python 'if' at method level
db.session.query(Tableclass).filter({
           if value_1 Tableclass.column_1 == value_1 \
           else if value_2 Tableclass.column_2 == value_2 else None
    }).first()

# ^-- or something similar at method level

或者,仅当基础值存在时,才使SQLAlchemy过滤器的一部分处于活动状态。

此处的主要动机是DRY并避免对None值进行DB搜索。

尝试将starred expressionif语句的内联组合设为suggested

session.query(Foo).filter((*[Foo.attr1==attr1,Foo.attr2==attr2] if attr2 else *[Foo.attr1==attr1]))

但是我在SyntaxError: invalid syntax得到了if

更新

目前,我使用this style将条件定义为可以附加在一起的单独变量:

query = session.query(Table)

conditions = []
if abc:
    conditions.append(Table.field1 == foo)
if def:
    conditions.append(Table.field2 == bar)

query = query.filter(or_(*conditions))

尽管我很欣赏Pierre V在为星标表达式和or_(Tableclass.column_1 == value_1,true() if value_1 is None else false())建议修正语法时的回答。

wyx900525 回答:SQLAlchemy ORM / Python:仅当搜索值不为None时,才包含查询过滤器的单行(内联'if')

通过移动括号可以消除语法错误:

session.query(Foo).filter(*([Foo.attr1==attr1,Foo.attr2==attr2] if attr2 else [Foo.attr1==attr1]))

否则,您可以使用true()false() Sqlalchemy表达式来获得所需的结果。

类似的东西:

db.session.query(TableClass).filter(
    or_(TableClass.column_1 == value_1,true() if value_1 is None else false()),or_(TableClass.column_2 == value_2,true() if value_2 is None else false())
).first()

但是恕我直言,它感觉比以前笨拙

query = db.session.query(TableClass)
if value_1:
    query = query.filter(TableClass.column_1 == value_1)
if value_2:
    query = query.filter(TableClass.column_2 == value_2)
本文链接:https://www.f2er.com/2920872.html

大家都在问