Sqlalchemy:使用多个filter()调用生成或子句

Sqlalchemy:使用多个filter()调用生成或子句,sqlalchemy,Sqlalchemy,我对sqlalchemy还不熟悉,需要一些帮助。 我正在尝试编写一个小应用程序,我必须为它动态更改select语句。所以我做了s=select([files]),然后我通过s=s.where(files.c.createtime.between(val1,val2))添加过滤器。 这非常有效,但只适用于AND连接。 因此,当我希望所有条目都具有createtime(介于1.1.2009和1.2.2009之间)或createtime==5.2.2009时,我遇到了一个问题,我不知道如何通过不同的过

我对sqlalchemy还不熟悉,需要一些帮助。 我正在尝试编写一个小应用程序,我必须为它动态更改select语句。所以我做了
s=select([files])
,然后我通过
s=s.where(files.c.createtime.between(val1,val2))
添加过滤器。 这非常有效,但只适用于AND连接。 因此,当我希望所有条目都具有
createtime(介于1.1.2009和1.2.2009之间)或createtime==5.2.2009
时,我遇到了一个问题,我不知道如何通过不同的过滤器调用实现这一点。由于程序逻辑,无法使用
s=s.where(_或(files.c.createtime.between(val1,val2),files.c.createtime==DateTime('2009-02-01'))

提前感谢,,
Christof

您可以从列表中动态生成或子句:

clauses = []
if cond1:
    clauses.append(files.c.createtime.between(val1, val2))
if cond2:
    clauses.append(files.c.createtime == DateTime('2009-02-01'))
if clauses:
    s = s.where(or_(*clauses))
如果您愿意通过使用
Select
对象上的undocumented
\u whereclause
属性进行“欺骗”,则可以通过每次基于上一个查询的where子句构建新查询来递增地指定一系列OR术语:

s = select([files]).where(literal(False)) # Start with an empty query.
s = select(s.froms).where(or_(s._whereclause,
        files.c.createtime.between(val1, val2)))
s = select(s.froms).where(or_(s._whereclause,
        files.c.createtime == datetime(2009, 2, 1)))
建立工会是另一种选择。这有点笨拙,但不依赖于未记录的属性:

s = select([files]).where(literal(False)) # Start with an empty query.
s = s.select().union(
        select([files]).where(files.c.createtime.between(val1, val2)))
s = s.select().union(
        select([files]).where(files.c.createtime == datetime(2009, 2, 1)))