2013-10-02 6 views
10

Nun, ich habe mit einem Zweifel über sqlalchemy und Objekte erfrischend zu tun!Über das Aktualisieren von Objekten in der Sitzung sqlalchemy

Ich bin in der Situation, in dem ich 2 Sitzungen habe, und das gleiche Objekt wurde in beiden Sitzungen abgefragt! ... Für eine bestimmte Sache kann ich nicht eine der Sitzungen zu schließen. Ich habe das Objekt geändert und die Änderungen in Sitzung A festgelegt, aber in Sitzung B sind die Attribute die ersten! ohne Änderungen! ..

Also ... soll ich eine Art von Benachrichtigungssystem implementieren, um Änderungen zu kommunizieren, oder es gibt eine eingebaute Möglichkeit, dies in sqlalchemy zu tun?

+1

http://stackoverflow.com/a/18684124/1309352 –

+0

Dies kann auch helfen : http://stackoverflow.com/a/25694346/134904 – kolypto

Antwort

17

Sessions are designed to work like this. Die Attribute des Objekts in Sitzung B werden beibehalten, was es bei der ersten Abfrage in Sitzung B hatte. Außerdem versucht SQLAlchemy nicht, Objekte in anderen Sitzungen automatisch zu aktualisieren, wenn sie sich ändern, und ich halte es auch nicht für sinnvoll, etwas zu erstellen so was.

Sie sollten aktiv über die Lebensdauer jeder Sitzung als eine einzelne Transaktion in der Datenbank denken. 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 benötigen selbst bestimmen und codieren. Die "richtige" Antwort könnte sein, zu sagen, dass dies kein Problem ist: Die Logik, die mit Sitzung B auftritt, könnte gültig sein, wenn sie die Daten zu dem Zeitpunkt verwendete, zu dem Sitzung B gestartet wurde. Ihr "Problem" ist möglicherweise kein Problem. Die docs haben tatsächlich ein entire section on when to use sessions, aber es gibt eine ziemlich düster Antwort, wenn Sie für eine one-size-fits-all-Lösung hoffen ...

A Session typischerweise zu Beginn einer logischen Operation aufgebaut ist, wo der Datenbankzugriff möglicherweise erwartet wird.

Sobald die Sitzung mit der Datenbank kommuniziert wird, beginnt eine Datenbanktransaktion, sobald sie mit der Kommunikation beginnt. Unter der Annahme, dass das Autocommit-Flag bei der empfohlenen Standardeinstellung False belassen wird, bleibt diese Transaktion in Bearbeitung, bis die Sitzung zurückgesetzt wird, festgeschrieben oder geschlossen. Die Sitzung beginnt mit einer neuen Transaktion, wenn sie nach der vorherigen Transaktionsbeendigung erneut verwendet wird ; von Daraus folgt, dass die Sitzung eine Lebensdauer über viele Transaktionen haben kann, obwohl nur eine nach der anderen. Wir beziehen uns auf diese zwei Konzepte als Transaktionsumfang und Sitzungsumfang.

Die hier Implikation ist, dass die SQLAlchemy ORM die Entwickler ermutigt, diese beiden Bereiche in seiner Anwendung zu etablieren, einschließlich nicht nur, wenn die Bereiche beginnen und enden, sondern auch die Weite jener Bereiche, zum Beispiel sollte eine einzelne Sitzungsinstanz lokal für den Ausführungsfluss innerhalb einer Funktion oder Methode sein, sollte es ein globales Objekt sein, das von der gesamten Anwendung verwendet wird, oder irgendwo zwischen diese beiden.

Die Belastung des Entwicklers, diesen Bereich zu bestimmen, ist ein Bereich , wo das SQLAlchemy ORM unbedingt eine starke Meinung darüber hat, wie die Datenbank verwendet werden sollte. Das Arbeitseinheitsmuster ist speziell einer der kumulativen Änderungen im Laufe der Zeit und spült sie in regelmäßigen Abständen, Beibehalten des Speicherzustands in Übereinstimmung mit dem, was bekanntermaßen in einer lokalen Transaktion vorhanden ist.Dieses Muster ist nur wirksam, wenn sinnvolle Transaktionsbereiche vorhanden sind.

Das heißt, es gibt ein paar Dinge, die Sie tun können, um zu ändern, wie die Situation funktioniert:

Erstens können Sie reduzieren, wie lange die Sitzung geöffnet bleibt. Session B abfragt das Objekt, dann später Sie etwas mit diesem Objekt tun (in der gleichen Sitzung), die Sie die Attribute auf dem neuesten Stand haben wollen. Eine Lösung besteht darin, diese zweite Operation in einer separaten Sitzung durchzuführen.

Ein weiterer Grund ist die Verfalls/Refresh-Methoden zu verwenden, da die docs show ...

# 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 session.refresh() sofort verwenden können, um eine up-to-date zu bekommen Version des Objekts, auch die Sitzung, wenn bereits fragte das Objekt früher ab. diese

+0

Thx! Ich möchte sagen, dass ich die komplette Sessions Dokumentation gelesen habe. Aber selbst wenn ich das getan habe, habe ich ein paar Probleme zu entschlüsseln, wo ich die Sitzung starten soll und wo es in meinem Anwendungscode endet, und das ist nicht in der Dokumentation, haha. –

+0

Wann und wie Sie Sitzungen verwenden, unterscheidet sich von Anwendung zu Anwendung. Es gibt keine einheitliche Lösung für jede Größe, und es wird beschrieben, wie man den Prozess der Bestimmung, der ein ganzes Buch sein könnte, angehen würde. Also, fühlen Sie sich nicht schlecht, dass Sie sich nicht sicher sind, wie Sie es tun sollen, da es kein einfaches Problem ist. –

+0

Nun, ich sage das, ich fühle mich freier beim Erstellen eines Workflows, der meine Bedürfnisse erfüllt, und versuche nicht, ein Muster zu finden, wo es nicht existieren kann! –

Verwandte Themen