【问题标题】:MySql connector dies in PythonMySql 连接器在 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) (这是我能找到的不会触发错误的最小睡眠时间)。真的很奇怪,但感谢发布。你找到合适的解决方案了吗?

标签: python mysql mysql-connector-python


【解决方案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。

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 1970-01-01
      • 2014-12-10
      • 2019-06-15
      • 2018-07-11
      • 2019-01-27
      • 2011-06-23
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多