2010-09-01 80 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))) 
相關問題