簡體   English   中英

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2013, '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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM