Sessies zijn ontworpen om zo te werken . De attributen van het object in Sessie B ZULLEN behouden wat het had toen het voor het eerst werd opgevraagd in Sessie B. Bovendien zal SQLAlchemy niet proberen om objecten in andere sessies automatisch te vernieuwen wanneer ze veranderen, en ik denk ook niet dat het verstandig zou zijn om te proberen iets te creëren zoals dit.
U moet de levensduur van elke sessie actief beschouwen als een enkele transactie in de database. Hoe en wanneer sessies moeten omgaan met het feit dat hun objecten oud kunnen zijn, is geen technisch probleem dat kan worden opgelost door een algoritme dat is ingebouwd in SQLAlchemy (of een extensie voor SQLAlchemy):het is een "zakelijk" probleem waarvan u de oplossing moet zelf bepalen en coderen. Het "juiste" antwoord zou kunnen zijn om te zeggen dat dit geen probleem is:de logica die optreedt bij Sessie B zou geldig kunnen zijn als het de gegevens zou gebruiken op het moment dat Sessie B begon. Uw "probleem" is misschien niet echt een probleem. De documenten hebben eigenlijk een hele sectie over wanneer sessies te gebruiken , maar het geeft een nogal grimmig antwoord als je hoopt op een one-size-fits-all oplossing...
Dat gezegd hebbende, zijn er een paar dingen die je kunt doen om de situatie te veranderen:
Ten eerste kunt u verkorten hoe lang uw sessie open blijft. Sessie B bevraagt het object, later doe je iets met dat object (in dezelfde sessie) waarvan je wilt dat de attributen up-to-date zijn. Een oplossing is om deze tweede operatie in een aparte sessie te laten doen.
Een andere is het gebruik van de methode voor verlopen/vernieuwen, zoals de docs toon ...
# immediately re-load attributes on obj1, obj2
session.refresh(obj1)
session.refresh(obj2)
# expire objects obj1, obj2, attributes will be reloaded
# on the next access:
session.expire(obj1)
session.expire(obj2)
U kunt session.refresh()
. gebruiken om onmiddellijk een up-to-date versie van het object te krijgen, zelfs als de sessie het object al eerder heeft opgevraagd.