SQLAlchemy: la relazione nei mappatori compila il risultato della funzione anziché chiamarla quando viene eseguita la query
-
08-07-2019 - |
Domanda
Ho un numero di mappatori che assomigliano a questo:
mapper(Photo,photo_table, properties = { "locale": relation(PhotoContent, uselist=False, primaryjoin=and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang()), foreign_keys=[photo_content_table.c.photoId, photo_content_table.c.locale])
Ho implementato in Pylons, quindi la funzione get_lang () dovrebbe restituire " en " o " es " basato sulla sessione corrente.
from pylons.i18n import get_lang
Il problema è che SA compila quella "local" " relazione con il risultato restituito da get_lang () al momento della compilazione. Quindi se faccio qualcosa del genere:
meta.Session.query(Photo).options(eagerload('locale')).get(id)
La relazione non chiama get_lang (). Usa semplicemente qualunque sia il valore di get_lang () al momento della compilazione.
Qualcuno ha qualche idea su come implementare i caricatori SQLAlchemy dinamici? Questo sarebbe un vero toccasana per me!
Soluzione
Le istruzioni di relazione vengono eseguite quando viene caricata la classe, il che significa che viene valutata ogni chiamata di funzione.
Prova invece a passare la funzione:
and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang)
Nota la parentesi mancante. Ora dovrebbe essere valutato ogni volta che viene interrogata la relazione.