【发布时间】:2018-01-14 02:12:17
【问题描述】:
我们正在尝试在我们的 Django (==1.11.4) 环境中使用 PyMySQL (==0.7.11)。但是当同时执行多个操作(多个请求发送到同一个 API 函数)时,我们会遇到问题。
我们得到这个错误:
pymysql.err.InternalError: 数据包序列号错误 - 得到 6 预计 1
我们正在尝试从数据库中删除记录(有时大量请求来自多个用户)。
代码:
def delete(self, delete_query):
self.try_reconnect()
return self._execute_query(delete_query)
def try_reconnect(self):
if not self.is_connected:
self.connection.ping(reconnect=True)
@property
def is_connected(self)
try:
self.connection.ping(reconnect=False)
return True
execpt:
return False
def _execute_query(self, query):
with self.connection.cursor() as cursor:
cursor.execute(query)
self.connection.commit()
last_row_id = cursor.lastrowid
return last_row_id
我认为没有必要指出这些函数是 DBHandler 类的一部分, 和 self.connection 在 def connect(self) 函数中初始化。
def connect(self):
self.connection = pymysql.connect(...)
这个connect函数在Django启动时运行一次,我们为整个项目创建一个DBHandler的全局实例(变量),并导入多个文件。
我们使用 delete 函数作为我们的网关来执行删除查询。
我们做错了什么?我们该如何解决?
【问题讨论】:
-
你还没有说问题出在哪里。还有你为什么直接使用连接,而不是使用Django的orm?
-
我们正在写入已经存在的数据库(不是我们的)。问题是当我们并行执行操作时会出现异常。异常类型:1. InternalError: 数据包序列号错误 2. AttributeError: 'NoneType' object has no attribute 'timeout'
标签: django multithreading python-2.7 api pymysql