Оператор выбора Python SQL из переменной списка?

#python #sql #sqlite

#питон #sql #sqlite #python

Вопрос:

Я пытаюсь запросить свою базу данных sqlite3 и использовать значения из списка. Вот мой код:

 for i in range(len(infolist)):
    result = cursor.execute('SELECT COUNT(DISTINCT col1) 
                               FROM tablename 
                              WHERE col2 = ?', (infolist[i]))
  

Я получаю эту ошибку:

Ошибка программирования: ‘Указано неверное количество привязок. В текущем операторе используется 1, а их указано 22.’

Строка содержит 22 символа, что объясняет, почему существует 22 привязки. Очевидно, что я неправильно передаю строку в оператор SQL.

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

1. Использование IN предложения, если массив можно превратить в список, разделенный запятыми, будет работать лучше и устранит необходимость в цикле.

Ответ №1:

Второй аргумент cursor.execute — это последовательность, и вы передали ему строку (которая представляет собой последовательность символов). Если вы пытаетесь создать кортеж из 1 элемента, вам нужна запятая. т.е. ('item',) вместо ('item')

Также вы должны перебирать элементы и не использовать range и i:

 for info in infolist:
    result = cursor.execute('SELECT COUNT(DISTINCT col1) 
                               FROM tablename 
                              WHERE col2 = ?', (info,))
  

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

1. Спасибо за информацию, что вы думаете об итерации нескольких списков ie. для i в диапазоне (len(infolist)): cursor.execute(‘ОБНОВИТЬ табличные данные, УСТАНОВИТЬ col1=?,col2=? ГДЕ col3=?’, (infolist[i], infolist2[i], infolist3[i]))

2. Это другой вопрос, но cursor.executemany('UPDATE tabledata SET col1=?,col2=? WHERE col3=?', zip(inforlist, infolist2, infolist3)) это то, что вы хотите.

Ответ №2:

Вам нужно добавить запятую в конец (infolist[i]) прямо сейчас это строка из 22 символов, а не кортеж. (infolist[i],) следует исправить это

Ответ №3:

Вам нужно добавить запятую, чтобы указать, что кортеж содержит 1 элемент:

 >>> ('abc')
'abc'
>>> ('abc',)
('abc',)
  

Попробуйте передать (infolist[i],) в cursor.execute .