2010-09-01 11 views
8

Sono nuovo in sqlalchemy e potrei usare un po 'di aiuto. Sto provando a scrivere una piccola applicazione per la quale devo modificare dinamicamente un'istruzione select. Così faccio s = select([files]), e poi aggiungo i filtri per s = s.where(files.c.createtime.between(val1, val2)). Funziona alla grande, ma solo con una congiunzione AND. Quindi, quando voglio avere tutte le voci con createtime (between 1.1.2009 and 1.2.2009) OR createtime == 5.2.2009, ho avuto il problema che non so come ottenere questo con diverse chiamate di filtro. A causa della logica dei programmi non è possibile utilizzare s= s.where(_or(files.c.createtime.between(val1, val2), files.c.createtime == DateTime('2009-02-01')))Sqlalchemy: produce una clausola OR con filtro multiplo() - Chiamate

Grazie in anticipo, Christof

risposta

26

È possibile costruire o clausole in modo dinamico sulla base di liste:

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

piuttosto comodo pezzo di codice – Dimitris

+0

bel pezzo di code.Thanks :) – SRC

2

Se siete disposti a "barare" utilizzando l'attributo _whereclause non documentato sugli oggetti Select, è possibile specificare in modo incrementale una serie di termini OR creando una nuova query ogni volta in base alla clausola where della query precedente:

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

Costruire un sindacato è un'altra opzione. Questo è un po 'ingombranti, ma non si basa su attributi senza documenti:

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))) 
Problemi correlati