sql >> Databáze >  >> RDS >> Mysql

O obnovování objektů v relaci sqlalchemy

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.



  1. MySQL - Trvalé připojení vs sdružování připojení

  2. magento tabulka sales_flat_order pole protect_code vysvětlení

  3. divné - výjimka mysql sql::SQLException není zachycena svým typem, ale je zachycena jako std::exception a úspěšně odevzdávána zpět

  4. Jak změnit název databáze na serveru SQL pomocí T-SQL