[英]pymysql.err.OperationalError - Lost connection to MySQL server during query
[英]sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')
我正在使用 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)
現在,我試圖讓這段代碼使用 Python 包 sshtunnel 連接到遠程數據庫。 下面是這段代碼的樣子:
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)
看起來像這樣正在連接,但在啟動我的燒瓶應用程序后,我立即收到以下錯誤:
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')
對此問題的任何見解都會有所幫助。 提前致謝!
您可以在Flask-SQLAlchemy
配置SQLALCHEMY_POOL_TIMEOUT
設置為小於SQLALCHEMY_POOL_RECYCLE
的值。 檢查文檔的超時部分。
我試過 pool_recycle 值小於 wait_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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.