2012-05-20 15 views
8

Si tengo una consulta SQLAlchemy ORM:SQLAlchemy ORM: modificar las columnas devueltas por una consulta

admin_users = Session.query(User).filter_by(is_admin=True) 

¿Es posible modificar las columnas devueltas por esa consulta?

Por ejemplo, para que pudiera seleccionar sólo la columna de la User.id, y el uso que en una consulta substitución:

admin_email_addresses = Session.query(EmailAddress)\ 
    .filter(EmailAddress.user_id.in_(admin_users.select_columns(User.id)) 

Nota: el método .values() no funcionará, ya que ejecuta la consulta y devuelve un iterable de resultados (por lo tanto, ex, EmailAddress.user_id.in_(admin_users.values(User.id)) realizará dos consultas, ninguna).

Sé que podría modificar la primera consulta para que sea Session.query(User.id), pero me pregunto específicamente cómo podría modificar las columnas devueltas por una consulta.

Respuesta

16

Siento su dolor en la cosa values(). En 0.6.5 añadí with_entities() que es igual, excepto values() no repetir:

q = q.with_entities(User.id) 
1

Suponiendo que su Address.user_id define un ForeignKey, la consulta a continuación va a hacer el trabajo de manera más eficiente en comparación con IN operador:

admin_email_addresses = session.query(EmailAddress).\ 
    join(User).filter(User.is_admin==True) 

Si usted no tiene un ForeignKey (aunque debería), se puede especificar el join condición explícitamente:

admin_email_addresses = session.query(EmailAddress).\ 
    join(User, User.id==EmailAddress.user_id).filter(User.is_admin==True) 

Pero si realmente desea hacerlo con in_ operador, aquí tienes (nótese el subquery):

subq = session.query(User.id).filter(User.is_admin==True).subquery() 
admin_email_addresses = session.query(EmailAddress).\ 
     filter(EmailAddress.user_id.in_(subq)) 
+0

Es cierto que, en el ejemplo que he proporcionado, un 'JOIN' es la solución correcta. Sin embargo, dado que no aborda la pregunta que realmente hice, voy a aceptar la respuesta de zzzeek. –

+0

@DavidWolever: bastante justo – van

Cuestiones relacionadas