Conector MySQL de Python: se encontró un resultado no leído al usar fetchone

Estoy insertando datos JSON en una base de datos MySQL

Estoy analizando el JSON y luego insertándolo en una base de datos MySQL usando el conector python

A través de la prueba, puedo ver que el error está asociado con esta pieza de código

for steps in result['routes'][0]['legs'][0]['steps']: query = ('SELECT leg_no FROM leg_data WHERE travel_mode = %s AND Orig_lat = %s AND Orig_lng = %s AND Dest_lat = %s AND Dest_lng = %s AND time_stamp = %s') if steps['travel_mode'] == "pub_tran": travel_mode = steps['travel_mode'] Orig_lat = steps['var_1']['dep']['lat'] Orig_lng = steps['var_1']['dep']['lng'] Dest_lat = steps['var_1']['arr']['lat'] Dest_lng = steps['var_1']['arr']['lng'] time_stamp = leg['_sent_time_stamp'] if steps['travel_mode'] =="a_pied": query = ('SELECT leg_no FROM leg_data WHERE travel_mode = %s AND Orig_lat = %s AND Orig_lng = %s AND Dest_lat = %s AND Dest_lng = %s AND time_stamp = %s') travel_mode = steps['travel_mode'] Orig_lat = steps['var_2']['lat'] Orig_lng = steps['var_2']['lng'] Dest_lat = steps['var_2']['lat'] Dest_lng = steps['var_2']['lng'] time_stamp = leg['_sent_time_stamp'] cursor.execute(query,(travel_mode, Orig_lat, Orig_lng, Dest_lat, Dest_lng, time_stamp)) leg_no = cursor.fetchone()[0] print(leg_no) 

He insertado detalles de nivel superior y ahora estoy buscando en la base de datos para asociar esta información de nivel inferior con su principal. La única forma de encontrar este valor único es buscar a través de las coordenadas de origen y destino con la marca de tiempo. Creo que la lógica es sólida y al imprimir el leg_no inmediatamente después de esta sección, puedo ver que los valores que aparecen en la primera inspección son correctos

Sin embargo, cuando se agrega al rest del código, causa secciones subsiguientes donde se insertan más datos usando el cursor para fallar con este error:

  raise errors.InternalError("Unread result found.") mysql.connector.errors.InternalError: Unread result found. 

El problema parece similar a MySQL Unread Result con Python

¿La consulta es demasiado compleja y necesita división o hay otro problema?

Si la consulta es demasiado compleja, ¿puede alguien recomendar la mejor manera de dividir esto?

EDITAR Según la ayuda de @Gord, he intentado deshacer cualquier resultado no leído

 cursor.execute(query,(leg_travel_mode, leg_Orig_lat, leg_Orig_lng, leg_Dest_lat, leg_Dest_lng)) leg_no = cursor.fetchone()[0] try: cursor.fetchall() except mysql.connector.errors.InterfaceError as ie: if ie.msg == 'No result set to fetch from.': pass else: raise cursor.execute(query,(leg_travel_mode, leg_Orig_lat, leg_Orig_lng, leg_Dest_lat, leg_Dest_lng, time_stamp)) 

Pero, todavía tengo

 raise errors.InternalError("Unread result found.") mysql.connector.errors.InternalError: Unread result found. [Finished in 3.3s with exit code 1] 

rasca la cabeza

EDIT 2 – cuando imprimo el ie.msg, obtengo –

 No result set to fetch from 

Todo lo que se requería era para que el búfer se configurara como verdadero.

 cursor = cnx.cursor(buffered=True) 

Tuve la oportunidad de recrear su problema. MySQL Connector / Python aparentemente no le gusta si recuperas varias filas y no las recuperas todas antes de cerrar el cursor o usarlo para recuperar otras cosas. Por ejemplo

 import mysql.connector cnxn = mysql.connector.connect( host='127.0.0.1', user='root', password='whatever', database='mydb') crsr = cnxn.cursor() crsr.execute("DROP TABLE IF EXISTS pytest") crsr.execute(""" CREATE TABLE pytest ( id INT(11) NOT NULL AUTO_INCREMENT, firstname VARCHAR(20), PRIMARY KEY (id) ) """) crsr.execute("INSERT INTO pytest (firstname) VALUES ('Gord')") crsr.execute("INSERT INTO pytest (firstname) VALUES ('Anne')") cnxn.commit() crsr.execute("SELECT firstname FROM pytest") fname = crsr.fetchone()[0] print(fname) crsr.execute("SELECT firstname FROM pytest") # InternalError: Unread result found. 

Si solo espera (o le importa) una fila, puede poner un LIMIT en su consulta

 crsr.execute("SELECT firstname FROM pytest LIMIT 0, 1") fname = crsr.fetchone()[0] print(fname) crsr.execute("SELECT firstname FROM pytest") # OK now 

o puede usar fetchall() para deshacerse de los resultados no leídos una vez que haya terminado de trabajar con las filas que recuperó.

 crsr.execute("SELECT firstname FROM pytest") fname = crsr.fetchone()[0] print(fname) try: crsr.fetchall() # fetch (and discard) remaining rows except mysql.connector.errors.InterfaceError as ie: if ie.msg == 'No result set to fetch from.': # no problem, we were just at the end of the result set pass else: raise crsr.execute("SELECT firstname FROM pytest") # OK now