2011-10-04 7 views
32

Come verificare che i dati nella query siano esistenti?sqlalchemy esiste per la query

Ad esempio:

users_query = User.query.filter_by(email='[email protected]') 

Come posso verificare che gli utenti con che la posta elettronica esiste?

Ora posso controllare questo con

users_query.count() 

ma vogliono controllare con esiste.

Grazie!

risposta

12

Non c'è modo che io sappia di farlo utilizzando l'API di query di orm. Ma si può scendere a un livello più basso e utilizzare exists da sqlalchemy.sql.expression:

from sqlalchemy.sql.expression import select, exists 

users_exists_select = select((exists(users_query.statement),)) 
print engine.execute(users_exists_select).scalar() 
56

La seguente soluzione è un po 'più semplice:

from sqlalchemy.sql import exists 

print session.query(exists().where(User.email == '...')).scalar() 
+0

Si noti che ciò darebbe risultati errati per i tipi polimorfici. Quando si filtra su entrambi gli attributi padre e figlio, la query risultante selezionerà dal prodotto cartesiano (outer join) delle tabelle. Per risolvere il problema, devi impostare manualmente la clausola 'FROM' tramite' select_from': 'e = esiste (selezionare ([1]). Select_from (Utente) .where (e_ (User.email == '...' , ...))). select() ' – aikoven

+0

@aikoven: il tuo suggerimento risulta in un errore' Ogni tabella derivata deve avere il proprio alias'. Aggiungendo 'esiste (...) .select(). Alias ​​('foo')' risolto (vedi [alias()] (http://docs.sqlalchemy.org/en/latest/core/selectable.html#sqlalchemy. sql.expression.alias)). – Jens

12

L'opzione più accettabile e leggibile per me è

session.query(<Exists instance>).scalar() 

come

session.query(User.query.filter(User.id == 1).exists()).scalar() 

che restituisce True o False.

+1

Inoltre, alcuni database come SQL Server non consentono un'espressione EXISTS nella clausola delle colonne di SELECT. Per selezionare un valore booleano semplice basato sull'esistenza WHERE, utilizzare sqlalchemy.literal: 'session.query (letterale (True)). Filter (q.exists()). Scalar()' – kaka

Problemi correlati