example - sqlalchemy python query
SQLAlchemy: selección de las columnas de un objeto en una consulta (3)
El último documento para load_only
está aquí
http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#load-only-cols
Si está buscando una forma de controlar eso en el nivel de definición del modelo, use el
http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#deferred
¿Es posible controlar qué columnas se consultan en el método de consulta de SQLAlchemy, mientras se siguen devolviendo instancias del objeto que se está consultando (aunque esté parcialmente poblado)?
¿O es necesario que SQLAlchemy realice un SELECT *
para asignarlo a un objeto?
(Sé que la consulta de columnas individuales está disponible, pero no asigna el resultado a un objeto, solo a un componente de una tupla nombrada).
Por ejemplo, si el objeto Usuario tiene los atributos ID de usuario, nombre, contraseña y biografía, pero desea que la consulta solo complete el 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)>
...
Es posible; ¿si es así, cómo?
Una solución simple que funcionó para mí fue:
users = session.query(User.userid, User.name)
for user in users:
print user
imprimiría:
<User(1, ''bob'')>
<User(2, ''joe'')>
...
puede consultar columnas individuales, que devuelven tuplas con nombre que, de hecho, actúan de manera muy parecida a su objeto mapeado si simplemente está pasando a una plantilla o algo así:
http://www.sqlalchemy.org/docs/orm/tutorial.html#querying
o puede establecer varias columnas en la clase asignada como "diferida", ya sea de forma configurativa o usando opciones:
http://docs.sqlalchemy.org/en/latest/orm/loading_columns.html#deferred-column-loading
hay un boleto viejo en trac para algo llamado "defer_everything_but ()", si alguien tiene ganas de realizar pruebas y no hay ninguna razón para que no se pueda agregar una característica, aquí hay 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 debería aceptar múltiplos, se agregó el boleto # 2250 para eso (edición: como se señaló en el comentario, esto está en 0.9 como load_only() )