Relace jsou navrženy tak, aby fungovaly takto . Atributy objektu v relaci B si zachovají to, co měl při prvním dotazu v relaci B. Navíc se SQLAlchemy nebude pokoušet automaticky obnovovat objekty v jiných relacích, když se změní, ani si nemyslím, že by bylo moudré pokoušet se něco vytvořit takhle.
Měli byste aktivně uvažovat o životnosti každé relace jako o jedné transakci v databázi. Jak a kdy se relace musí vypořádat se skutečností, že jejich objekty mohou být zastaralé, není technický problém, který lze vyřešit algoritmem zabudovaným do SQLAlchemy (nebo jakéhokoli rozšíření pro SQLAlchemy):je to „obchodní“ problém, jehož řešení musíte určit a kód sami. "Správnou" odpovědí může být, že se nejedná o problém:logika, která se vyskytuje u relace B, by mohla být platná, pokud by používala data v době, kdy relace B začala. Váš "problém" nemusí být ve skutečnosti problém. Dokumenty ve skutečnosti mají celá část o tom, kdy používat relace , ale pokud doufáte v univerzální řešení, dává to dost ponurou odpověď...
To znamená, že existuje několik věcí, které můžete udělat, abyste změnili fungování situace:
Za prvé, můžete zkrátit dobu, po kterou vaše relace zůstane otevřená. Relace B se dotazuje na objekt a později s tímto objektem (ve stejné relaci) děláte něco, co chcete, aby byly atributy aktuální. Jedním z řešení je nechat tuto druhou operaci provést v samostatné relaci.
Dalším je použití metod expire/refresh, jak je uvedeno v dokumentech zobrazit ...
# 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)
Můžete použít session.refresh()
okamžitě získat aktuální verzi objektu, i když se relace již dotazovala na objekt dříve.