Не работает 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 шт):

Автор решения: Roman-Stop RU aggression in UA

Вся проблема в том, что вы неправильно используете метод 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))
→ Ссылка