¿Cómo saber si una relación perezosa aún no está cargada, con SQLAlchemy?
-
06-07-2019 - |
Pregunta
Con SQLAlchemy, ¿hay alguna manera de saber de antemano si una relación estaría cargada de pereza?
Por ejemplo, dada una relación perezosa entre padres e hijos y una instancia X de '' padres '', me gustaría saber si '' X.niños '' ya está cargado, sin activar la consulta.
Solución
Creo que podría mirar el diccionario de atributos __dict__
del niño para verificar si los datos ya están allí o no.
Otros consejos
Puede obtener una lista de todas las propiedades descargadas (tanto relaciones como columnas) de sqlalchemy.orm.attributes.instance_state (obj) .unloaded
.
Ver: Completando el objeto con sus relaciones y evitando consultas innecesarias en sqlalchemy
Una forma más fácil es usar inspect ()
, que da los mismos resultados:
from sqlalchemy import inspect
from sqlalchemy.orm import lazyload
user = session.query(User).options(lazyload(User.articles)).first()
ins = inspect(user)
ins.unloaded # <- set or properties that are not yet loaded
Un poco más limpio que la respuesta de Haes (aunque efectivamente hace lo mismo) es usar hasattr (), como en:
>>> hasattr(X, 'children')
False