MySql 连接器在 Python 中死机

Posted

技术标签:

【中文标题】MySql 连接器在 Python 中死机【英文标题】:MySql connector dies in Python 【发布时间】:2012-10-14 07:10:15 【问题描述】:

编辑: 这个问题令人难以置信。我现在已经设法用 time.sleep(0.01) 替换了烦人的打印功能,但究竟为什么我应该从更慢的执行时间中受益,这超出了我的理解。

我在 Python 3.23 的 mysql 1.0.7 连接器中迭代光标时遇到问题。

除非 print() 每次迭代的结果(这既愚蠢又耗时)我会引发以下错误:

引发错误。InterfaceError(errno=2013) mysql.connector.errors.InterfaceError: 2013: 失去与 MySQL 的连接 查询期间的服务器

有什么想法吗?

到目前为止,代码很简单:

self.config = 'user': user,'password': password,'host': host,'database':     
database,'raise_on_warnings': True

self.data = []
self.clickcnx = mysql.connector.connect(**self.config)
self.clickcursor = self.clickcnx.cursor()

query = "SELECT table1, table2, table3 FROM `db`-tables;"
self.clickcursor.execute(query)
for item in self.clickcursor:
  print(item)     #this is the strange line that I need!
  self.data.append(item)
self.clickcnx.close()

【问题讨论】:

请发布触发此问题的代码。 就我而言,“解决方案”是 time.sleep(0.000001) (这是我能找到的不会触发错误的最小睡眠时间)。真的很奇怪,但感谢发布。你找到合适的解决方案了吗? 【参考方案1】:

您错过了实际获取结果的部分,您只是跨过光标。

试试这个版本:

query = "SELECT table1, table2, table3 FROM `db`-tables;"
self.clickcursor.execute(query)
results = self.clickcursor.fetchall()
for item in results:
  print(item)     #this is the strange line that I need!
  self.data.append(item)
self.clickcnx.close()

【讨论】:

完全相同的错误......非常奇怪。您推荐的更改实际上变得更糟,因为现在奇怪的 print() 语句不再有帮助。我一定是得罪了 SQL 之神…… 你用的是什么mysql驱动? mysql.connector.connect 不是来自MySQLdb 太好了,您仍然在线。它来自他们的网站,版本 1.0.7。我在哪里可以下载你提到的那个?啊,好的,我现在看到链接了。我在中国,所以链接可能有点断...【参考方案2】:

我在 1.0.7 中遇到了同样的问题。添加 time.sleep() 修复它。然后我升级到 1.0.10 并删除了睡眠。这也很好用。

所以解决方案似乎是:

pip install --upgrade mysql-connector-python

您可能需要使用 sudo。

【讨论】:

【参考方案3】:

我遇到了 MySQL 连接器的问题。我尝试了 Burhan Khalid 的回答,但没有奏效。我能够通过添加 GROUP BY 语句来解决我的问题。

原始查询:

SELECT
    a.ID,
    a.UID,
    g.GroupId,
FROM Accounts a
    LEFT JOIN Profile p ON p.ID = a.ID
    LEFT JOIN Group g ON g.GroupId = p.GroupId
WHERE
    a.UID IS NOT NULL
    AND a.Active = 1
    AND a.Type = 1;

返回与原始结果相同的查询:

SELECT
    a.ID,
    a.UID,
    g.GroupId,
FROM Accounts a
    LEFT JOIN Profile p ON p.ID = a.ID
    LEFT JOIN Group g ON g.GroupId = p.GroupId
WHERE
    a.UID IS NOT NULL
    AND a.Active = 1
    AND a.Type = 1
GROUP BY
    a.UID;

唯一的区别是第二个查询不会引发 InterfaceError(2013)。我的查询返回大约 250,000 行。我对这些查询中的每一个都进行了解释,令我惊讶的是,第二个查询比第一个查询花费了更长的时间(持续时间),因为它将结果存储在一个临时表中,但获取时间从 6.00 秒变为 0.50 秒!

尝试添加一个 GROUP BY 聚合器,看看是否能解决您的问题。当然,您需要确保您的结果是相同的。我建议对您知道是唯一的表值执行 GROUP BY。

【讨论】:

以上是关于MySql 连接器在 Python 中死机的主要内容,如果未能解决你的问题,请参考以下文章

pcie转接器死机

通过hibernate session.connection()获得数据库连接时,导致的查询缓慢甚至假死机问题

Win11远程连接Win7死机闪退

使用mysql连接器python在python中编码问题

通过 Spring Websocket STOMP 打开连接会导致我们的服务器死机

LIKE 子句。在 python 连接器中 mysql