Z SQLAlchemy, czy istnieje sposób, aby wcześniej wiedzieć, czy relacja będzie leniwy załadowany?
Na przykład, biorąc pod uwagę leniwy związek rodzica-> dzieci i instancję X "rodzica", chciałbym wiedzieć, czy "X.children" jest już załadowany, bez wyzwalania zapytania.Jak sprawdzić, czy leniwy związek nie jest jeszcze załadowany, z SQLAlchemy?
Odpowiedz
Myślę, że możesz sprawdzić słownik atrybutów dziecka, aby sprawdzić, czy dane już tam są.
Lekko neater niż Haes odpowiedź (choć skutecznie robi to samo) jest użycie hasattr(), na przykład:
>>> hasattr(X, 'children')
False
Nice, thanks :) – Joril
To nie działa aktualna sqlalchemy. 'hasattr (obj, field)' nie jest równoważne 'polu w obj .__ dict__'. –
Testowałem w SQLAlchemy 0.8 i to działa, jeśli obiekt jest odłączony. Jednak jeśli jest podłączony, użycie hasattr wyzwala leniwy ładunek "dzieci", co prawdopodobnie nie jest tym, czego potrzebujesz. Zamiast tego w 0.8 możemy użyć wywołania inspect(): 'res = inspect (X)' ''children' in res.unloaded' - który działa niezależnie od tego, czy obiekt jest dołączony czy odłączony. – foz
Można uzyskać listę wszystkich rozładowywane właściwości (zarówno stosunki i kolumny) od sqlalchemy.orm.attributes.instance_state(obj).unloaded
.
Patrz: Completing object with its relations and avoiding unnecessary queries in sqlalchemy
Łatwiejszy sposobem jest użycie inspect()
, co daje te same wyniki:
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
To działa, dzięki :) – Joril