Question

EDIT: This problem is unbelievable. I have now managed to replace an annoying print function with the time.sleep(0.01), but why on earth I should benefit from a SLOWER execution time is beyond me.

I have a problem in iterating over my cursor in MySQL 1.0.7 connector for Python 3.23.

Unless print() the result of each iteration (which is both silly and time consuming) I get the following error raised:

raise errors.InterfaceError(errno=2013) mysql.connector.errors.InterfaceError: 2013: Lost connection to MySQL server during query

Any thoughts?

the code is trivial thusfar:

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()
Was it helpful?

Solution

You are missing the part where you actually fetch the results, you are just stepping over the cursor.

Try this version:

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()

OTHER TIPS

I had the same issue with 1.0.7. Adding a time.sleep() fixed it. Then I upgraded to 1.0.10 and removed the sleep. That also works fine.

So the solution seems to be:

pip install --upgrade mysql-connector-python

You might need to use sudo.

I had the issue with MySQL connector. I tried Burhan Khalid's answer, but it did not work. I was able to solve my problem by adding a GROUP BY statement.

Original query:

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;

Query that returns the same results as the original:

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;

The only difference is the second query does not throw an InterfaceError(2013). My query returns around 250,000 rows. I ran an explain on each of these queries and to my suprise, the second query takes longer (Duration) than the first because it stores the results in a temporary table, but the fetch time went from 6.00s to 0.50s!

Try to add a GROUP BY agregator and see if that solves your problem. Of course you need to ensure your results are the same. I suggest doing a GROUP BY on a table value that you know will be unique.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top