flask-sqlalchemy失去了与MySQL db的连接

时间:2018-03-01 15:30:05

标签: python mysql flask flask-sqlalchemy

使用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中包装所有请求,因为我有很多代码。

1 个答案:

答案 0 :(得分:0)

我不知道第一个和第二个问题的答案,但是对于第三个问题,我使用修饰符来包装所有函数,而不是直接在函数内部使用try /。显式的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"