Versuchen Sie, ein
hinzuzufügen
app.teardown_request(Exception=None)
Decorator, der am Ende jeder Anfrage ausgeführt wird. Ich habe derzeit ein ähnliches Problem und es scheint, als hätte ich es heute tatsächlich mit gelöst.
@app.teardown_request
def teardown_request(exception=None):
Session.remove()
if exception and Session.is_active:
print(exception)
Session.rollback()
Ich verwende Flask-SQLAlchemy
nicht Nur rohes SQLAlchemy
, daher kann es für Sie Unterschiede geben.
Aus den Dokumenten
In meinem Fall öffne ich eine neue scoped_session
für jede Anfrage, sodass ich es am Ende jeder Anfrage entfernen muss (Flask-SQLAlchemy
kann dies nicht erforderlich sein). Außerdem wird der Teardown_request-Funktion eine Exception
übergeben wenn einer während des Kontexts aufgetreten ist. Wenn in diesem Szenario eine Ausnahme aufgetreten ist (die möglicherweise dazu führt, dass die Transaktion nicht entfernt wird oder ein Rollback erforderlich ist), prüfen wir, ob eine Ausnahme aufgetreten ist, und führen ein Rollback durch.
Wenn dies für meine eigenen Tests nicht funktioniert, war das nächste, was ich tun würde, ein session.commit()
bei jedem Teardown, nur um sicherzustellen, dass alles gespült wird
UPDATE:Es scheint auch, dass MySQL Verbindungen nach 8 Stunden ungültig macht, wodurch die Sitzung beschädigt wird.
setzen Sie pool_recycle=3600
auf Ihrer Engine-Konfiguration oder auf eine Einstellung