Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Informationen zum Aktualisieren von Objekten in einer sqlalchemy-Sitzung

Sitzungen sind so konzipiert, dass sie so funktionieren . Die Attribute des Objekts in Sitzung B WERDEN behalten, was es hatte, als es zum ersten Mal in Sitzung B abgefragt wurde. Außerdem wird SQLAlchemy nicht versuchen, Objekte in anderen Sitzungen automatisch zu aktualisieren, wenn sie sich ändern, noch denke ich, dass es klug wäre, zu versuchen, etwas zu erstellen so.

Sie sollten die Lebensdauer jeder Sitzung aktiv als einzelne Transaktion in der Datenbank betrachten. Wie und wann Sitzungen mit der Tatsache umgehen müssen, dass ihre Objekte möglicherweise veraltet sind, ist kein technisches Problem, das durch einen in SQLAlchemy (oder eine beliebige Erweiterung für SQLAlchemy) integrierten Algorithmus gelöst werden kann:Es ist ein "geschäftliches" Problem, dessen Lösung Sie müssen selber bestimmen und codieren. Die „richtige“ Antwort könnte lauten, dass dies kein Problem ist:Die Logik, die bei Sitzung B auftritt, könnte gültig sein, wenn sie die Daten zum Zeitpunkt des Starts von Sitzung B verwendet. Dein "Problem" ist vielleicht gar kein Problem. Die Dokumente haben tatsächlich einen vollständiger Abschnitt darüber, wann Sessions verwendet werden sollen , aber es gibt eine ziemlich düstere Antwort, wenn Sie auf eine Einheitslösung hoffen ...

Allerdings gibt es ein paar Dinge, die Sie tun können, um die Funktionsweise der Situation zu ändern:

Erstens können Sie reduzieren, wie lange Ihre Sitzung offen bleibt. Sitzung B fragt das Objekt ab, und später tun Sie etwas mit diesem Objekt (in derselben Sitzung), sodass die Attribute auf dem neuesten Stand sein sollen. Eine Lösung besteht darin, diese zweite Operation in einer separaten Sitzung durchführen zu lassen.

Eine andere Möglichkeit besteht darin, die Methoden "expire/refresh" zu verwenden, wie in den docs anzeigen ...

# 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)

Sie können session.refresh() verwenden um sofort eine aktuelle Version des Objekts zu erhalten, auch wenn die Sitzung das Objekt bereits früher abgefragt hat.