Come scoprire se una relazione pigra non è ancora stata caricata, con SQLAlchemy?
-
06-07-2019 - |
Domanda
Con SQLAlchemy, c'è un modo per sapere in anticipo se una relazione verrebbe caricata lentamente?
Ad esempio, data una relazione pigra parentale con i figli e un'istanza X di "parent", mi piacerebbe sapere se "X.children" è già caricato, senza attivare la query.
Soluzione
Penso che potresti guardare il dizionario dell'attributo __dict__
del bambino per verificare se i dati sono già lì o meno.
Altri suggerimenti
Puoi ottenere un elenco di tutte le proprietà scaricate (sia relazioni che colonne) da sqlalchemy.orm.attributes.instance_state (obj) .unloaded
.
Vedi: Completamento dell'oggetto con le sue relazioni ed evitando query inutili in sqlalchemy
Un modo più semplice è usare inspect ()
, che fornisce gli stessi risultati:
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
Leggermente più pulito della risposta di Haes (anche se effettivamente fa la stessa cosa) è usare hasattr (), come in:
>>> hasattr(X, 'children')
False