SQLAlchemy: la relation dans les mappeurs compile le résultat de la fonction plutôt que d'appeler la fonction lorsque la relation est interrogée
-
08-07-2019 - |
Question
J'ai un certain nombre de mappeurs qui ressemblent à ceci:
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])
J’ai déployé dans les pylônes, la fonction get_lang () doit donc renvoyer soit " en " ou "es" en fonction de la session en cours.
from pylons.i18n import get_lang
Le problème est que SA compile cet "environnement local". relation avec le résultat renvoyé par get_lang () lors de la compilation. Donc, si je fais quelque chose comme ça:
meta.Session.query(Photo).options(eagerload('locale')).get(id)
La relation n’appelle pas get_lang (). Il utilise simplement la valeur de get_lang () au moment de la compilation.
Quelqu'un at-il une idée de la manière de mettre en œuvre des chargeurs dynamiques SQLAlchemy? Ce serait une bouée de sauvetage pour moi!
La solution
Les instructions de relation sont exécutées lorsque la classe est chargée, ce qui signifie que chaque appel de fonction est évalué.
Essayez de transmettre la fonction à la place:
and_(photo_content_table.c.photoId == photo_table.c.id, photo_content_table.c.locale == get_lang)
Notez la parenthèse manquante. Elle devrait maintenant être évaluée chaque fois que la relation est interrogée.