Ошибка типа: не удается распаковать не итерируемый объект int для python распознавания лиц.

#python #python-3.x #opencv #face-recognition #mysql-connector-python

#python #python-3.x #opencv #распознавание лиц #mysql-соединитель-python

Вопрос:

Я хочу выполнить программу распознавания лиц для посещаемости с использованием python, в которой программа будет обнаруживать лицо, сохранять информацию о пользователе, такую как идентификатор и имя, в таблицу people в базе данных MySQL, а затем программа распознает лицо и вставит информацию о сохраненном пользователе ранее в другую таблицу, втаблица посещаемости. Однако я столкнулся с ошибкой «TypeError: не удается распаковать неинтерируемый объект int» в приведенной ниже кодировке:

             db = database.open()
            cursor_person = db.cursor()
            cursor_att = db.cursor()
            cursor_person.execute("SELECT pID, name_reg FROM people")
            for row in cursor_person.fetchone():
                pID, name_reg = row
                
                cursor_att.execute("UPDATE attendance(ppID, name_att) SET ('{}', '{}') WHERE" .format (pID, name_reg))
            db.commit()
 

Часть, в которой произошла ошибка, выглядит так, как показано ниже:

 pID, name_reg = row <--- TypeError: cannot unpack non-iterable int object
 

Кто-нибудь знает, как это решить? Я надеюсь, что предоставленная мной информация окажется полезной. Заранее благодарю вас.

Комментарии:

1. Я думаю, что добавление a print в цикл помогло бы. Это покажет, что проблема заключается в значениях или их присвоении row

2. Каков вывод row значения? row Переменная не возвращает два значения.

3. @Ahx Я хочу вставить pID и name_reg из таблицы «люди» в таблицу «посещаемость» с тем же значением, идентификатором и именем. или запрос, который я использую, неверен?

4. @AbrarAhmed Я пробовал, но я не совсем уверен, в чем проблема, потому что я снова получаю ту же ошибку.

Ответ №1:

Я полагаю, вы хотели бы использовать fetchall
Обратите внимание, что ваша фраза update sql нарушена.

  for row in cursor_person.fetchall():
     cursor_att.execute("UPDATE attendance SET ('{}', '{}') WHERE" .format (row[0], row[1]))
 

Ответ №2:

Способ отладить это print(row) — посмотреть, что это такое.

Но я предполагаю, что ваша реальная проблема заключается в том, что эти два курсора не изолированы, поскольку они используют один и тот же сеанс. Вероятно, эта cursor_att.execute() строка приводит cursor_person.fetchone() к возвращению количества обновленных строк, т.е. int 1 .

Наконец, вы не должны использовать .format для установки значений предложения UPDATE. В противном случае вы рискуете подвергнуться атакам SQL-инъекций или просто случайным ошибкам с вашей стороны, когда значения содержат символы типа ' . Есть пример того, как правильно передавать параметры следующим образом:

 cursor.execute("UPDATE attendance SET (%s, %s)", (pID, name_reg))
 

И библиотека mysql-connector автоматически экранирует строки для вас.