Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2013年,查询期间与MySQL服务器的连接中断';)_Python_Flask_Sqlalchemy_Flask Sqlalchemy_Ssh Tunnel - Fatal编程技术网

Python sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2013年,查询期间与MySQL服务器的连接中断';)

Python sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2013年,查询期间与MySQL服务器的连接中断';),python,flask,sqlalchemy,flask-sqlalchemy,ssh-tunnel,Python,Flask,Sqlalchemy,Flask Sqlalchemy,Ssh Tunnel,我正在使用Python、Flask和SQLAlchemy。 在构建我的应用程序时,我一直在使用本地数据库,它可以很好地使用以下代码: from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config[ 'SQLALCHEMY_DATABASE_URI'] = \ 'mysql+pymysql://<username>:<passwor

我正在使用Python、Flask和SQLAlchemy。 在构建我的应用程序时,我一直在使用本地数据库,它可以很好地使用以下代码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config[
    'SQLALCHEMY_DATABASE_URI'] = \
    'mysql+pymysql://<username>:<password>@localhost/<DBName>'

db = SQLAlchemy(app)

对这个问题的任何洞察都会有所帮助。提前谢谢

您可以在
Flask SQLALCHEMY
的配置中将
SQLALCHEMY\u POOL\u RECYCLE
设置为小于
SQLALCHEMY\u POOL\u TIMEOUT
的值。检查文档的部分。

我尝试了池回收值小于等待超时(对于mariadb数据库使用50),但我不知道为什么它对我不起作用!在try/except块工作中使用显式pre_ping和会话回滚/关闭。我使用下面的装饰器包装了我的所有函数,解决了我的问题:

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
def my_function(*args, **kwargs):
    return "result"

谢谢你的回复!我不确定这是否与我的问题有关。我正在与MariaDB合作,文档中的注释说明MariaDB确实希望抛出这个问题。我试图添加以下几行代码,但没有效果:app.config['SQLALCHEMY\u POOL\u TIMEOUT']=600 app.config['SQLALCHEMY\u POOL\u RECYCLE']=100我不确定,使用app.config['SQLALCHEMY\u DATABASE\u URI'],如何正确设置它。最后,我打开了MySQL数据库,允许外部连接,这是可行的。不确定是否应该改用SSH隧道?我也尝试过这个建议的变体,但它不起作用。其他线程也报告它并不总是有效的。
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
def my_function(*args, **kwargs):
    return "result"