使用PyMySQL出现接口错误(数据库连接关闭)

问题描述 投票:0回答:2

我在程序中使用 PyMySQL 库和 Flask。我的视图函数每次调用时都会访问数据库。经过一些跟注后,它会破裂并升起

InterfaceError(0, '')
。所有接下来的请求也会引发 InterfaceError (特别是任何数据库查询)。

Traceback (most recent call last):
   (several files of mine and Flask)
  File "/home/maxim/.local/lib/python3.7/site-packages/pymysql/cursors.py", line 170, in execute
    result = self._query(query)
  File "/home/maxim/.local/lib/python3.7/site-packages/pymysql/cursors.py", line 328, in _query
    conn.query(q)
  File "/home/maxim/.local/lib/python3.7/site-packages/pymysql/connections.py", line 516, in query
    self._execute_command(COMMAND.COM_QUERY, sql)
  File "/home/maxim/.local/lib/python3.7/site-packages/pymysql/connections.py", line 750, in _execute_command
    raise err.InterfaceError("(0, '')")
pymysql.err.InterfaceError: (0, '')

我阅读了 PyMySQL 库代码并发现,如果连接的

_sock
变量为 None (我认为这意味着连接已关闭),则会发生此错误。但为什么会这样?

我对所有视图函数使用一个连接对象(即它是在函数外部定义的)。我这样做是否正确,还是每个请求都必须建立新的连接?或者我需要做其他事情来消除这个错误?

我的代码:https://pastebin.com/sy3xKtgB
完整追溯:https://pastebin.com/iTU75FUi

python mysql python-3.x database pymysql
2个回答
0
投票

我通过为每个请求创建一个与数据库的新连接来解决我的问题。

def get_db():
    return pymysql.connect(
        'ip',
        'user',
        'password',
        'db_name',
        cursorclass=pymysql.cursors.DictCursor
    )

我在每次请求时都会调用此函数。

from flask import Flask, request
from my_utils import get_db

app = Flask(__name__)
@app.route('/get', methods=['POST'])
def get():
    conn = get_db()
    with conn.cursor() as cur:
        pass

0
投票

你可以使用

try —— except

并且仅在必要时重新连接数据库。

例如:

connection = pymysql.connect(
    'ip',
    'user',
    'password',
    'db_name',
    cursorclass=pymysql.cursors.DictCursor
)
query = connection.cursor()

try:
    query.execute ( "" )
except pymysql.err.InterfaceError:
    connection.ping(reconnect=True)
    query.execute ( "" )
© www.soinside.com 2019 - 2024. All rights reserved.