2011-08-08 17 views
15

¿Es posible controlar qué columnas se consultan en el método de consulta de SQLAlchemy, al tiempo que se devuelven instancias del objeto que está consultando (aunque parcialmente poblado)?SQLAlchemy: seleccionando qué columnas de un objeto en una consulta

¿O es necesario que SQLAlchemy realice un SELECT * para asignar un objeto?

(Sé que está disponible consultar columnas individuales, pero no correlaciona el resultado con un objeto, solo con un componente de una tupla con nombre).

Por ejemplo, si el objeto Usuario tiene la ID de usuario atributos, nombre, contraseña y bio, pero desea que la consulta para llenar sólo en ID de usuario y el nombre de los objetos que devuelve:

# hypothetical syntax, of course: 
for u in session.query(User.columns[userid, name]).all(): 
    print u 

imprimiría :

<User(1, 'bob', None, None)> 
<User(2, 'joe', None, None)> 
... 

Esto es posible; ¿si es así, cómo?

Respuesta

16

puede consultar para las columnas individuales, que devuelve tuplas con nombre que, de hecho, actúan más o menos como su objeto mapeado si acaba de hacer pasar a una plantilla o algo:

http://www.sqlalchemy.org/docs/orm/tutorial.html#querying

o puede establecer diversas columnas en la clase mapeada como "diferido", o bien, de configuración o utilizando opciones:

http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#deferred-column-loading

hay un billete de edad en trac para algo g llama "defer_everything_but()", si alguien se sentía como que proporcionan pruebas y como no hay razón para que no podría ser una característica añadir, he aquí una versión rápida:

from sqlalchemy.orm import class_mapper, defer 
def defer_everything_but(entity, cols): 
    m = class_mapper(entity) 
    return [defer(k) for k in 
      set(p.key for p 
       in m.iterate_properties 
       if hasattr(p, 'columns')).difference(cols)] 

s = Session() 
print s.query(A).options(*defer_everything_but(A, ["q", "p"])) 

Defer() realmente debe aceptar múltiplos, agregó billete # 2250 para que (edit: como se señala en el comentario de esto está en 0,9 como load_only())

+9

En sa> = 0.9.0, vea ['load_only()'] (http://docs.sqlalchemy.org/en/latest/orm/mapper_config.html#sqlalchemy.orm.load_only) – kolypto

5

Una solución sencilla que trabajó para mí era:

users = session.query(User.userid, User.name) 
for user in users: 
    print user 

imprimiría:

<User(1, 'bob')> 
<User(2, 'joe')> 
... 
Cuestiones relacionadas