尝试添加
app.teardown_request(Exception=None)
装饰器,在每个请求结束时执行。我目前正在遇到类似的问题,好像今天我实际上已经使用解决了。
@app.teardown_request
def teardown_request(exception=None):
Session.remove()
if exception and Session.is_active:
print(exception)
Session.rollback()
我不使用Flask-sqlAlchemy
Only Raw sqlAlchemy
,所以它可能对您有所不同。
来自文档
拆卸回调是特殊的回调,因为它们在不同的位置执行。严格来讲,它们与实际的请求处理无关,因为它们绑定到RequestContext对象的生命周期。弹出请求上下文时,将调用teardown_request()函数。
就我而言,我scoped_session
为每个请求都打开一个新文件,要求我在每个请求结束时将其删除(Flask- sqlAlchemy
可能不需要这个)。同样,Exception
如果在上下文期间发生了一次,则会传递teardown_request函数。在这种情况下,如果发生异常(可能导致不删除事务或需要回滚),我们将检查是否存在异常,然后回滚。
如果这对于我自己的测试不起作用,那么我接下来要做的就是session.commit()
每次拆解时,确保所有东西都在冲洗
更新:8小时后,MysqL也似乎使连接无效,从而导致会话被破坏。
设置pool_recycle=3600
你的发动机配置,或设置<MysqL的超时。结合适当的会话范围(结束会话)应该可以做到这一点。