2013-03-07 24 views
6

In SQL, posso ottenere una serie di righe come questa:query per valori multipli in una sola volta

SELECT * FROM table WHERE id in (2,3,5,7,11); 

Come funziona la query sqlalchemy equivalente guardare? cls.id in [2,3,5,7,11] viene valutato come False, quindi questo codice:

q = meta.Session.query(cls) 
q = q.filter(cls.id in [2,3,5,7,11]) 
return q.all() 

fallisce con un'eccezione:

File "foo.py", line 1234, in findall_by_ids 
    q = q.filter(cls.id in [2,3,5,7,11]) 
    File "<string>", line 1, in <lambda> 
    File "/eggs/sqlalchemy/orm/query.py", line 50, in generate 
    fn(self, *args[1:], **kw) 
    File "/eggs/sqlalchemy/orm/query.py", line 1177, in filter 
    "filter() argument must be of type " 
ArgumentError: filter() argument must be of type sqlalchemy.sql.ClauseElement 
       or string 

risposta

11

Usa in_

q.filter(cls.id.in_([2, 3, 5, 7, 11])) 

vostro interprete ha detto:

ArgumentError: filter() argument must be of type sqlalchemy.sql.ClauseElement 
       or string 

Gli operatori sono stati sovrascritti e tornerà quello di filtro bisogno, si può dare un'occhiata a sqlalchemy.sql.operators. Il motivo per cui cls.id in [2, 3, 5, 7, 1] non funziona è perché il numero in è l'operatore di [2, 3, 5, 7, 1], restituirà True o False.

3

Usa in_, in questo modo:

q = meta.Session.query(cls) 
q = q.filter(cls.id.in_([2,3,5,7,11])) 
return q.all() 
1

Se non si conoscono le colonne PK la soluzione migliore è usare get ma è per una riga.

Per un non-PK composito

pk = model.__mapper__.primary_key[0] 
items = model.query.filter(pk.in_(ids)).all() 
Problemi correlati