2012-08-24 13 views
5

Ich habe ein Problem mit SQL Alchemy - meine App funktioniert als eine ständig funktionierende Python-Anwendung.Wie vermeidet man Caching in Sqlalchemy?

Ich habe Funktion wie folgt aus:

def myFunction(self, param1): 
    s = select([statsModel.c.STA_ID, statsModel.c.STA_DATE)])\ 
         .select_from(statsModel) 

    statsResult = self.connection.execute(s).fetchall() 

    return {'result': statsResult, 'calculation': param1} 

Ich denke, das klares Beispiel ist - eine Ergebnismenge aus der Datenbank geholt wird, der zweite wird nur als Argument übergeben.

Das Problem ist, dass, wenn ich Daten in meiner Datenbank ändere, diese Funktion noch Daten zurückgibt, als ob nichts geändert wurde. Wenn ich die Daten im Eingabeparameter ändere, hat der zurückgegebene Parameter "calculation" den richtigen Wert.

Wenn ich den App-Server neu starte, wird die Situation wieder normal - neue Daten werden von MySQL geholt.

Ich weiß, dass es einige Fragen über SQLAlchemy Caching wie: dieser Situation

How to disable SQLAlchemy caching?

aber wie andere kann ich anrufen

How to disable caching correctly in Sqlalchemy orm session?? Es scheint, dass SQLAlchemy die Daten, die zuvor abgerufen wurden, beibehält und keine neuen Abfragen durchführt, bis die Anwendung neu gestartet wird. Wie kann ich ein solches Verhalten vermeiden?

+0

Wie ändern Sie die Daten in der Datenbank? Wird das geändert? – icecrime

+0

ändere ich es manuell. Die Datenbank-Engine ist MySQL. Ja, die Änderung ist festgeschrieben. – Archarius

+0

http://StackOverflow.com/a/15788051/497208 kann nützlich sein –

Antwort

1

Ein paar Möglichkeiten.

  1. Sie verwenden Ihre session nicht ordnungsgemäß oder zu einem falschen Zeitpunkt. Best Practice ist es, Ihre session nach dem Festschreiben wegzuwerfen und eine neue im letzten möglichen Moment zu bekommen, bevor Sie sie verwenden. Das Verhalten, das scheinbar zwischengespeichert wird, liegt möglicherweise daran, dass eine Lebensdauer von session in Ihrer Anwendung sehr lang ist.
  2. Objekte, die länger als die session überleben, werden nicht in eine nachfolgende session zusammengeführt. Die "Metadaten" sind möglicherweise nicht in der Lage, ihren Status zu aktualisieren, wenn Sie sie nicht wieder zusammenführen. Dies ist eher ein Problem für die ORM-API von SQLAlchemy, die Sie bisher noch nicht verwenden.
  3. Ihre Änderungen werden nicht übernommen. Sie sagen, sie sind so, dass wir davon ausgehen, dass es das nicht ist, aber wenn keiner der anderen Wege dies erklärt, wollen Sie vielleicht noch einmal nachsehen.

Ein allgemeiner Debugging-Tipp: Wenn Sie genau wissen wollen, was SQLAlchemy in der Datenbank tut, übergibt echo=True an die create_engine Funktion. Die Engine druckt alle ausgeführten Abfragen.

Auch check out this suggestion Ich machte zu jemand anderem, der ORM verwendet hatte und Transaktionsprobleme hatte, die ihr Problem lösten, ohne es jemals zu lokalisieren. Vielleicht wird es dir helfen.

9

Durch Aufrufen von session.expire_all() werden alle datenbankgeladenen Daten aus der Sitzung gelöscht. Jeder nachfolgende Zugriff auf Objektattribute gibt eine neue SELECT-Anweisung aus und ruft neue Daten zurück. Bitte beachten Sie http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html#refreshing-expiring für den Hintergrund.

Wenn Sie nach dem Aufruf von expire_all() immer noch das so genannte "Caching" sehen, müssen Sie Transaktionen abschließen, wie in meinem oben verlinkten answer beschrieben.

Verwandte Themen