Essayez d'ajouter un
app.teardown_request(Exception=None)
Décorateur, qui s'exécute à la fin de chaque requête. Je rencontre actuellement un problème similaire, et il semble qu'aujourd'hui je l'ai réellement résolu en utilisant.
@app.teardown_request
def teardown_request(exception=None):
Session.remove()
if exception and Session.is_active:
print(exception)
Session.rollback()
Je n'utilise pas Flask-SQLAlchemy
Uniquement brut SQLAlchemy
, il peut donc y avoir des différences pour vous.
À partir de la documentation
Dans mon cas, j'ouvre une nouvelle scoped_session
pour chaque requête, me demandant de le supprimer à la fin de chaque requête (Flask-SQLAlchemy
peut ne pas en avoir besoin). De plus, la fonction teardown_request reçoit une Exception
s'il y en a eu pendant le contexte. Dans ce scénario, si une exception s'est produite (provoquant éventuellement la non-suppression de la transaction ou nécessitant une annulation), nous vérifions s'il y a eu une exception et nous effectuons une annulation.
Si cela ne fonctionne pas pour mes propres tests, la prochaine chose que j'allais faire était un session.commit()
à chaque démontage, juste pour s'assurer que tout roule
MISE À JOUR :il semble également que MySQL invalide les connexions après 8 heures, provoquant la corruption de la session.
définir pool_recycle=3600
sur la configuration de votre moteur, ou sur un paramètre