2011-10-04 8 views
32

¿Cómo comprobar que los datos en la consulta existe?sqlalchemy existe para la consulta

Por ejemplo:

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

¿Cómo puedo comprobar que los usuarios con correo electrónico que existe?

Ahora puedo comprobar esto con

users_query.count() 

pero quieren comprobarlo con existe.

Gracias!

Respuesta

12

No hay forma de que sepa hacer esto usando la aplicación de consulta orm. Pero se puede caer a un nivel inferior y utilizar exists de 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 siguiente solución es un poco más simple:

from sqlalchemy.sql import exists 

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

Tenga en cuenta que esto daría resultados incorrectos para los tipos polimórficos. Al filtrar en atributos padre e hijo, la consulta resultante seleccionará de producto cartesiano (combinación externa) de tablas. Para solucionarlo, debe establecer manualmente la cláusula 'FROM' a través de' select_from': 'e = exists (select ([1]). Select_from (User) .where (and_ (User.email == '...' , ...))). select() ' – aikoven

+0

@aikoven: su sugerencia da como resultado una' Cada tabla derivada debe tener su propio error de alias'. Al agregar 'exists (...) .select(). Alias ​​('foo')' se arregló (ver [alias()] (http://docs.sqlalchemy.org/en/latest/core/selectable.html#sqlalchemy. función sql.expression.alias)). – Jens

12

La opción más aceptable y legible para mí es

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

como

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

que devuelve True o False.

+1

Además, tenga en cuenta que algunas bases de datos, como SQL Server, no permiten que exista una expresión EXISTS en la cláusula columns de un SELECT. Para seleccionar un valor booleano simple basado en el existente como WHERE, use sqlalchemy.literal: 'session.query (literal (True)). Filter (q.exists()). Escalar()' – kaka

Cuestiones relacionadas