Zkuste přidat
app.teardown_request(Exception=None)
Dekorátor, který se provede na konci každého požadavku. Momentálně se potýkám s podobným problémem a zdá se, jako bych ho dnes skutečně vyřešil pomocí.
@app.teardown_request
def teardown_request(exception=None):
Session.remove()
if exception and Session.is_active:
print(exception)
Session.rollback()
Nepoužívám Flask-SQLAlchemy
Pouze Raw SQLAlchemy
, takže to může mít pro vás rozdíly.
Z Dokumentů
V mém případě otevřu nový scoped_session
pro každý požadavek, který vyžaduje, abych jej na konci každého požadavku odstranil (Flask-SQLAlchemy
nemusí to potřebovat). Také funkci teardown_request je předána Exception
pokud k nějaké došlo během kontextu. V tomto scénáři, pokud došlo k výjimce (možná způsobující, že transakce nebude odstraněna nebo bude potřeba vrácení změn), zkontrolujeme, zda došlo k výjimce, a vrátíme zpět.
Pokud to nefunguje pro mé vlastní testování, další věc, kterou jsem chtěl udělat, bylo session.commit()
při každém odtržení, jen aby se ujistil, že je vše splachováno
AKTUALIZACE:také se zdá, že MySQL zruší platnost připojení po 8 hodinách, což způsobí poškození relace.
nastavte pool_recycle=3600
na konfiguraci vašeho motoru nebo na nastavení <časový limit MySQL. To by ve spojení se správným rozsahem relace (uzavření relací) mělo stačit.