使用 PyMySQL 的 InterfaceError(数据库连接关闭)
InterfaceError using PyMySQL (database connection closes)
我在我的程序中使用了 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
我通过为每个请求创建一个新的数据库连接来解决我的问题。
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 库和 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
我通过为每个请求创建一个新的数据库连接来解决我的问题。
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