Spróbuj dodać
app.teardown_request(Exception=None)
Dekorator, który wykonuje się na końcu każdego żądania. Obecnie mam podobny problem i wygląda na to, że dzisiaj faktycznie go rozwiązałem.
@app.teardown_request
def teardown_request(exception=None):
Session.remove()
if exception and Session.is_active:
print(exception)
Session.rollback()
Nie używam Flask-SQLAlchemy
Tylko surowa SQLAlchemy
, więc może się to różnić dla Ciebie.
Z Dokumentów
W moim przypadku otwieram nową scoped_session
dla każdego żądania, wymagając ode mnie usunięcia go na końcu każdego żądania (Flask-SQLAlchemy
może tego nie potrzebować). Ponadto funkcja teardown_request jest przekazywana jako Exception
jeśli wystąpił w kontekście. W tym scenariuszu, jeśli wystąpił wyjątek (prawdopodobnie powodujący, że transakcja nie została usunięta lub wymaga wycofania), sprawdzamy, czy wystąpił wyjątek i wycofujemy.
Jeśli to nie zadziała w przypadku moich własnych testów, następną rzeczą, którą zamierzałem zrobić, była session.commit()
przy każdym porzuceniu, aby upewnić się, że wszystko się spłukuje
AKTUALIZACJA :wygląda na to, że MySQL unieważnia połączenia po 8 godzinach, powodując uszkodzenie sesji.
ustaw pool_recycle=3600
w konfiguracji silnika lub do ustawienia