Разъем Python MySQL - непрочитанный результат при использовании fetchone

Я вставляю данные JSON в базу данных MySQL

Я разбираю JSON, а затем вставляю его в db MySQL, используя коннектор python

Через пробную версию я вижу, что ошибка связана с этим фрагментом кода

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)

Я добавил данные более высокого уровня, и теперь я ищу базу данных, чтобы связать эту информацию нижнего уровня с ее родителем. Единственный способ найти это уникальное значение - поиск по координатам происхождения и назначения с помощью параметра time_stamp. Я считаю, что логика звучит и, напечатав leg_no сразу после этого раздела, я могу увидеть значения, которые появляются при первой проверке, правильные

Однако, когда он добавляется к остальной части кода, он вызывает последующие разделы, в которые добавляется больше данных, с помощью курсора с этой ошибкой -

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

Проблема кажется похожей на Непрочитанный результат MySQL с Python

Является ли запрос слишком сложным и требует расщепления или есть еще одна проблема?

Если запрос действительно слишком сложный, может ли кто-нибудь посоветовать, как лучше разделить это?

РЕДАКТИРОВАТЬ В соответствии с рекомендацией @Gord Ive попытался сбросить все непрочитанные результаты

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

Но я все равно получаю

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

царапины головы

EDIT 2 - когда я печатаю ie.msg, я получаю -

No result set to fetch from

Ответы

Ответ 2

Я смог воссоздать вашу проблему. MySQL Connector/Python, по-видимому, не нравится, если вы извлекаете несколько строк и не извлекаете их все, прежде чем закрывать курсор или использовать его для извлечения некоторых других вещей. Например

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.

Если вы только ожидаете (или заботитесь) о одной строке, вы можете поместить LIMIT в свой запрос

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

или вы можете использовать fetchall(), чтобы избавиться от любых непрочитанных результатов после того, как вы закончили работу с полученными вами строками.

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

Ответ 3

Существует также вероятность того, что ваше соединение с MySQL Workbench отключено. Установите соединение снова. Это решило проблему для меня.