【问题标题】:SQLAlchemy ORM / Python: one-liner to include query filter only if searched value is not None (inline 'if')SQLAlchemy ORM / Python:仅当搜索值不是None时才包含查询过滤器的单行器(内联'if')
【发布时间】:2020-04-07 20:20:45
【问题描述】:

我可以在 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 值。

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

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

但我在if 得到SyntaxError: invalid syntax

更新

现在我使用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()) 建议修复语法的回答。

【问题讨论】:

    标签: python if-statement methods sqlalchemy inline


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 感谢您的建议。 or_(TableClass.column_2 == value_2, true() if value_2 is None else false()) 是 SQLAlchemy 的 or_ 函数所固有的还是 Python 表示法?
    • 我会说这是一个 SQLAlchemy 的东西,因为 or_()true()false() 是 SQLAlchemy 函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多