Не работает SQLite запрос с множественным условием WHERE
Пишу телеграм бота на aiogram, python. Возникла необходимость воспользоваться базой данных, написал следующий запрос:
for value in cur.execute("SELECT field FROM vlnt_table WHERE faculty = ? AND university = ?", (faculty_pressed, university_pressed)):
current_value = str(value)
fields_list.append(current_value)
Однако этот код не работает, выдается ошибка:
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.
Проверял все переменные, соотносил со значениями из базы, пробовал писать два отдельных запроса с каждой из переменных faculty_pressed и university_pressed (они работали), но вот вместе, в одном WHERE, они не работают. Мне нужны именно эти два условия, подскажите, в чем проблема, пожалуйста! Буду рад, если найдется вариант реализации этих условий с помощью двух запросов (мне нужно именно в цикле)
upd: показываю, что я вкладывал в переменные:
faculty_pressed = (message.text[10:],)
async with state.proxy() as abit_filter:
abit_filter['university'] = (message.text[12:],)
university_pressed = abit_filter['university']
Вот так я проверял, находятся ли соответствия:
for value in cur.execute('SELECT university FROM vlnt_table'):
print(value)
if value == university_pressed:
print('Должно работать!!')
Закину, пожалуй, всю функцию:
async def cmd_abit_filters_faculty(message: types.Message, state = FSMContext):
async with state.proxy() as abit_filter:
abit_filter['faculty'] = (message.text[10:],)
university_pressed = abit_filter['university']
faculty_pressed = (message.text[10:],)
print(abit_filter['university'])
fields_list = []
for value in cur.execute('SELECT university FROM vlnt_table'):
print(value)
if value == university_pressed:
print('Должно работать!!')
for i in cur.execute("SELECT field FROM vlnt_table WHERE (faculty = ?) AND (university = ?)", (faculty_pressed, university_pressed)):
current_value = str(value)
current_value = current_value.replace('(', '')
current_value = current_value.replace(')', '')
current_value = current_value.replace("'", "")
current_value = current_value.replace(',', '')
fields_list.append(current_value)
base.commit()
fields_set = list(set(fields_list))
fields_set = fields_list
kb_fields = ReplyKeyboardMarkup(resize_keyboard=True)
for i in fields_set:
kb_fields.add(f"Направление {i}")
await FSMFilters.next()
await bot.send_message(message.from_user.id, 'Выберите направление подготовки, о котором хотели бы узнать', reply_markup=kb_fields)
Ответы (1 шт):
Вся проблема в том, что вы неправильно используете метод execute у курсора, а именно неправильно передаете параметры запроса, т.е. второй параметр функции execute.
Если у вас запрос в котором есть несколько параметров т.е. значений, которые вы передаете в запрос и в самом тексте запроса вы их задает знаками вопроса, то второй параметр должен быть списком или кортежем, в котором первому знаку вопроса соответствует значение первого параметра, второму - значение второго и т.д.
На примере вашего запроса SELECT field FROM vlnt_table WHERE (faculty = ?) AND (university = ?). У вас два параметра (еще по другому называются связываемые переменные, bounded variables). Поля faculty и university у вас в БД, как я понял, строки. Значит вторым параметром в execute нужно передавать список или кортеж из двух строк.
Вы же передаете кортеж из двух элементов, но первым является не строка, а кортеж из одного элемента (например вот ('КБ',) - это кортеж из одной строки), который вы создаете тут:
faculty_pressed = (message.text[10:],)
Когда вы делали запрос для одного элемента, то вы передавали этот одноэлементый кортеж, как второй аргумент в execute, и это работало потому, что это именно то, что execute ждет - список или кортеж из стольких элементов, сколько у вас параметров в запросе (в этом случае 1).
Когда же у вас два параметра, то, как я уже сказал выше, нужно передавать кортеж из двух элементов. В вашем случае это означает, что нужно делать так:
faculty_pressed = message.text[10:]
Так же нужно убедиться, что university_pressed содержит строку со значением из колонки university (я все еще не понимаю из ваших ответов, что там за значение и какого оно типа) и тогда такой вызов будет работать, как ожидаете:
cur.execute("SELECT field FROM vlnt_table WHERE (faculty = ?) AND (university = ?)", (faculty_pressed, university_pressed))