SQLAlchemy:如果搜索值为None,如何避免查询过滤器

5 投票
2 回答
3635 浏览
提问于 2025-04-18 00:55

有没有一种简单的方法可以处理以下情况:

def queryByAttr(attr1,attr2=None):
  if attr2 is None:
    session.query(Foo).filter(Foo.attr1==attr1)
  else:
    session.query(Foo).filter(Foo.attr1==attr1).filter(Foo.attr2==attr2)

2 个回答

0

也可以使用。

def queryByAttr(attr1, attr2=None):
    return (session.query(Foo).filter((*[Foo.attr1==attr1, Foo.attr2==attr2] if attr2 else *[Foo.attr1==attr1])))
8

这里有一个更易读的多行代码,使用了链式调用:

def queryByAttr(attr1, attr2=None):
    q = session.query(Foo).filter(Foo.attr1 == attr1)
    if attr2 is not None:
        q = q.filter(Foo.attr2 == attr2)
    return q

你也可以把它写成一个(相对较长的)单行代码

def queryByAttr(attr1, attr2=None):
    return (session.query(Foo).filter(Foo.attr1 == attr1)) if attr2 is None else (session.query(Foo).filter(Foo.attr1 == attr1).filter(Foo.attr2 == attr2))

前提是你不需要查询那些Foo对象,它们的attr2值是NULL

撰写回答