2010-09-01 61 views
8

我是sqlalchemy的新手,可以使用一些帮助。 我想写一个小应用程序,我必须动态地改变一个选择语句。所以我做s = select([files]),然后我通过s = s.where(files.c.createtime.between(val1, val2))添加过滤器。 这很好,但只能用AND连词。 所以,当我想要所有条目与createtime (between 1.1.2009 and 1.2.2009) OR createtime == 5.2.2009,我有问题,我不知道如何实现这与不​​同的过滤器调用。由于程序逻辑的它不可能使用预先s= s.where(_or(files.c.createtime.between(val1, val2), files.c.createtime == DateTime('2009-02-01')))Sqlalchemy:使用多个过滤器生成OR子句() - 调用

感谢, 克里斯托夫

回答

26

您可以从列表中动态地建立或条款:

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)) 
+0

非常方便的一块代码 – Dimitris 2011-06-22 13:58:15

+0

尼斯一块code.Thanks的:) – SRC 2016-08-30 20:57:52

2

如果你愿意为“作弊”通过使用Select对象上未公开的_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)))