Prova ad aggiungere un
app.teardown_request(Exception=None)
Decoratore, che esegue alla fine di ogni richiesta. Attualmente sto riscontrando un problema simile e sembra che oggi l'abbia effettivamente risolto utilizzando.
@app.teardown_request
def teardown_request(exception=None):
Session.remove()
if exception and Session.is_active:
print(exception)
Session.rollback()
Non uso Flask-SQLAlchemy
Solo Raw SQLAlchemy
, quindi potrebbe avere delle differenze per te.
Da Documenti
Nel mio caso, apro una nuova scoped_session
per ogni richiesta, richiedendomi di rimuoverlo alla fine di ogni richiesta (Flask-SQLAlchemy
potrebbe non averne bisogno). Inoltre, alla funzione teardown_request viene passata un'Exception
se uno si è verificato durante il contesto. In questo scenario, se si verifica un'eccezione (che potrebbe causare la mancata rimozione della transazione o la necessità di un rollback), controlliamo se si è verificata un'eccezione e il rollback.
Se questo non funziona per i miei test, la prossima cosa che avrei fatto era un session.commit()
ad ogni smontaggio, solo per assicurarti che tutto stia andando a finire
AGGIORNAMENTO:sembra anche che MySQL invalidi le connessioni dopo 8 ore, causando il danneggiamento della Session.
imposta pool_recycle=3600
sulla configurazione del tuo motore o su un'impostazione