使用 PyMySQL 的 InterfaceError(数据库连接关闭)

Posted

技术标签:

【中文标题】使用 PyMySQL 的 InterfaceError(数据库连接关闭)【英文标题】:InterfaceError using PyMySQL (database connection closes) 【发布时间】:2020-12-03 18:52:54 【问题描述】:

我在我的程序中使用 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 变量为无(我认为这意味着连接已关闭),则会发生此错误。但是为什么会这样呢?

我为所有视图函数使用一个连接对象(即它是在函数外部定义的)。我做对了吗,或者我必须在每个请求中建立新的连接?或者我需要做一些其他的事情来摆脱这个错误?

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

【问题讨论】:

我怀疑这是您的基本问题,请参阅 zetcode.com/python/pymysql 并查看您的代码是否与此匹配,例如 result = self._query(query) 看起来完全不正确 不是我的代码,是库文件 请向我们展示您的代码以及您使用的库。还有你的查询到底是什么 我添加了带有代码+请求和完整回溯的链接 我运行了你的代码,但我的根本不喜欢平衡,pymysql 没有问题。我使用 python 3.8.5 【参考方案1】:

我通过为每个请求创建一个到 db 的新连接解决了我的问题。

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

【讨论】:

以上是关于使用 PyMySQL 的 InterfaceError(数据库连接关闭)的主要内容,如果未能解决你的问题,请参考以下文章

PyMySQL

pymysql 模块的使用

PyMySQL的基本操作

PyMysql

pymysql 使用

pymysql怎么逐条读取