Come scoprire se una relazione pigra non è ancora stata caricata, con SQLAlchemy?

StackOverflow https://stackoverflow.com/questions/258775

  •  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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top