[英]sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')
I'm working with Python, Flask, and SQLAlchemy.我正在使用 Python、Flask 和 SQLAlchemy。 I've been using a local database while building my application, and it has been working fine with the following code:
在构建我的应用程序时,我一直在使用本地数据库,并且使用以下代码运行良好:
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)
Now, I'm trying to get this code to connect to a remote database using the Python package sshtunnel.现在,我试图让这段代码使用 Python 包 sshtunnel 连接到远程数据库。 Here is what this code looks like:
下面是这段代码的样子:
from flask import Flask
from sshtunnel import SSHTunnelForwarder
from flask_sqlalchemy import SQLAlchemy
forwarding_server = SSHTunnelForwarder(
'1.2.3.4', #my host IP address
ssh_username="user",
ssh_password="password",
remote_bind_address=('127.0.0.1', 8080)
)
forwarding_server.start()
local_port = str(forwarding_server.local_bind_port)
app = Flask(__name__)
app.config[
'SQLALCHEMY_DATABASE_URI'] = \
'mysql+pymysql://<username>:<password>@127.0.0.1:' + local_port + '/<DBName>'
db = SQLAlchemy(app)
It SEEMS like this is connecting, but immediately after launching my flask application, I'm receiving the following error:看起来像这样正在连接,但在启动我的烧瓶应用程序后,我立即收到以下错误:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')
Any insight into this issue would be helpful.对此问题的任何见解都会有所帮助。 Thanks in advance!
提前致谢!
I tried pool_recycle value less than wait_timeout (used 50 for mariadb database), but I do not know why it didn't work for me!我试过 pool_recycle 值小于 wait_timeout(mariadb 数据库使用 50),但我不知道为什么它对我不起作用! Using an explicit pre_ping and session rollback / close within a try / except block work for me.
在 try / except 块中使用显式 pre_ping 和会话回滚/关闭对我有用。 I used this decorator below to wrap all my functions and that solved my problem:
我使用下面的这个装饰器来包装我的所有功能并解决了我的问题:
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
and then decorated my functions like below:然后装饰我的功能,如下所示:
@manage_session
def my_function(*args, **kwargs):
return "result"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.