繁体   English   中英

flask-sqlalchemy 失去与 MySQL 数据库的连接

[英]flask-sqlalchemy lost connection to MySQL db

使用 MySQL 数据库和flask-sqlalchemy 我遇到了连接丢失错误( 'Lost connection to MySQL server during query' )。 我已经将app.config['SQLALCHEMY_POOL_RECYCLE']调整为小于engine timeout 我还添加了一个pool_pre_ping ,以确保在两次请求期间数据库不会消失。 现在我不知道了,这仍然是一个问题,因为据我了解,flask-sqlalchemy 应该正确处理打开和关闭会话。

作为一种解决方法,我想了一种方法来告诉flask-sqlalchemy 捕获丢失的连接响应并即时重新启动连接。 但我不知道该怎么做。 所以,我的问题是:

  1. 你知道什么可能导致我的连接丢失吗?
  2. 你认为,我最近的捕捉方法是一个好主意还是你有更好的建议?
  3. 如果这是一个好主意,我怎样才能最方便地做到这一点? 我不想将所有请求都包装在 try-catch-statements 中,因为我有很多代码。

我不知道你的第一和第二个问题的答案,但对于第三个问题,我使用装饰器来包装我的所有函数,而不是直接在函数内部使用 try / except 。 显式的 pre_ping 和会话回滚/关闭不知何故也为我解决了丢失连接的问题(mariadb 是我使用的后端)!

def manage_session(f):
    def inner(*args, **kwargs):

        # MANUAL PRE PING
        try:
            db.session.execute("SELECT 1;")
            db.session.commit()
        except:
            db.session.rollback()
        finally:
            db.session.close()

        # SESSION COMMIT, ROLLBACK, CLOSE
        try:
            res = f(*args, **kwargs)
            db.session.commit()
            return res
        except Exception as e:
            db.session.rollback()
            raise e
            # OR return traceback.format_exc()
        finally:
            db.session.close()
    return inner

然后用装饰器包装我的函数:

@manage_session
my_funtion(*args, **kwargs):
    return "result"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM