Comment savoir si une relation paresseuse n'est pas encore chargée avec SQLAlchemy?
-
06-07-2019 - |
Question
Avec SQLAlchemy, existe-t-il un moyen de savoir à l'avance si une relation serait chargée paresseux?
Par exemple, dans le cas d'une relation parent paresseux avec enfants et d'une instance X de "parent", j'aimerais savoir si "X.children" est déjà chargé, sans déclencher la requête.
La solution
Je pense que vous pourriez consulter le dictionnaire d'attributs __ dict __
de l'enfant pour vérifier si les données sont déjà présentes ou non.
Autres conseils
Vous pouvez obtenir une liste de toutes les propriétés non chargées (relations et colonnes) à partir de sqlalchemy.orm.attributes.instance_state (obj) .unloaded
.
Voir: Finalisation d'objet avec ses relations et éviter les requêtes inutiles dans sqlalchemy
Un moyen plus simple consiste à utiliser inspect ()
, ce qui donne les mêmes résultats:
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
Une réponse un peu plus nette que Haes (bien que ce soit la même chose) consiste à utiliser hasattr (), comme dans:
>>> hasattr(X, 'children')
False