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

时间:2014-04-01 20:11:32

标签: python sqlalchemy

是否有单行代码来处理以下情况:

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 :(得分:1)

使用链接有一个更易读的多线程

def queryByAttr(attr1, attr2=None):
    q = session.query(Foo).filter(Foo.attr1==attr1)
    if not(attr2 is 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的{​​{1}}。

答案 1 :(得分:0)

也可以使用。

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