Python sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2013年,查询期间与MySQL服务器的连接中断';)
我正在使用Python、Flask和SQLAlchemy。 在构建我的应用程序时,我一直在使用本地数据库,它可以很好地使用以下代码: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
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"