Wie verfolgt SQLAlchemy Datenbankänderungen?

8

Ich frage mich, wie SQLAlchemy Änderungen verfolgt, die außerhalb von SQLAlchemy vorgenommen werden (manuelle Änderung zum Beispiel)?

Bis jetzt habe ich db.session.commit() vor jeden Wert gesetzt, der außerhalb von SQLAlchemy geändert werden kann. Ist das eine schlechte Übung? Wenn ja, gibt es einen besseren Weg, um sicherzustellen, dass ich den neuesten Wert habe? Ich habe unten ein kleines Skript erstellt, um dies zu überprüfen, und SQLAlchemy kann offensichtlich externe Änderungen erkennen, ohne dass db.session.commit() jedes Mal aufgerufen wird.

Danke,

P.S: Ich möchte wirklich verstehen, wie all die Wunder hinter SQLAlchemy funktionieren. Hat jemand einen Zeiger auf einige Dokumente, die die Arbeit von SQLAlchemy hinter den Kulissen erklären?

%Vor%     
Son 18.11.2015, 17:19
quelle

1 Antwort

4

Der "Cache" einer Sitzung ist ein dict in seiner identity_map (session.identity_map.dict), das Objekte nur für die Zeit "einer einzelnen Geschäftstransaktion" zwischenspeichert, wie hier beantwortet Ссылка .

Für verschiedene Serveranforderungen haben Sie eine andere identity_map. Es ist kein gemeinsames Objekt.

In Ihrem Szenario haben Sie den Server 2 getrennt angefordert. Beim zweiten Mal ist die identity_map eine neue (Sie können sie einfach durch Ausdrucken ihres Zeigers überprüfen) und hat nichts im Cache. Folglich wird die Sitzung die Datenbank anfordern und Ihnen die aktualisierte Antwort geben. Es ändert sich nicht wie Sie vielleicht denken.

Sie müssen also zu Ihrer Frage session.commit () vor einer Abfrage nicht ausführen, wenn Sie keine Abfrage für das selbe Objekt in der gleichen Serveranforderung durchgeführt haben .

Ich hoffe, es hilft.

    
Nhat Cuong Nguyen 20.11.2015, 00:35
quelle