Mit SQLAlchemy, gibt es eine Möglichkeit, vorher zu wissen, ob eine Beziehung lazy-loaded wäre?
Zum Beispiel würde ich angesichts einer faulen Eltern-> Kinder-Beziehung und einer Instanz X von "Eltern" gerne wissen, ob "X.children" bereits geladen ist, ohne die Abfrage auszulösen.Wie kann man herausfinden, ob eine Lazy-Relation mit SQLAlchemy noch nicht geladen ist?
Antwort
Ich denke, Sie könnten das Attributverzeichnis des Kindes betrachten, um zu überprüfen, ob die Daten bereits da sind oder nicht.
etwas ordentlicher als Haes Antwort (obwohl es effektiv die gleiche Sache tut) ist hasattr() zu verwenden, wie in:
>>> hasattr(X, 'children')
False
Nizza, Dank :) – Joril
Diese funktioniert nicht mit aktuelle sqlalchemy. 'hasattr (obj, field)' ist nicht äquivalent zu 'field in obj .__ dict__'. –
Ich habe in SQLAlchemy 0.8 getestet und das funktioniert, wenn das Objekt getrennt ist. Wenn es jedoch angehängt wird, löst die Verwendung von hasattr die Lazy Load von 'children' aus, was wahrscheinlich nicht das ist, was Sie wollen. Stattdessen können wir in 0.8 den Aufruf inspect() verwenden: 'res = inspect (X)' ''children' in res.unloaded' - was funktioniert, egal ob das Objekt angehängt oder entfernt wird. – foz
Sie können eine Liste aller unbelastet Eigenschaften erhalten (beide Beziehungen und Spalten) von sqlalchemy.orm.attributes.instance_state(obj).unloaded
.
See: Completing object with its relations and avoiding unnecessary queries in sqlalchemy
Ein einfacherer Weg ist inspect()
, zu verwenden, die die gleichen Ergebnisse erzielen lassen:
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
Es funktioniert dank :) – Joril