我正在用 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)
整个问题是您错误地使用
execute了游标方法,即您错误地传递了请求参数,即 函数的第二个参数execute。如果您有一个包含多个参数的请求,即 传递给请求的值并在请求文本本身中用问号设置它们,那么第二个参数必须是列表或元组,其中第一个问号对应于第一个参数的值,第二个到第二个的值,等等。
关于你的请求的例子
SELECT field FROM vlnt_table WHERE (faculty = ?) AND (university = ?)。您有两个参数(也称为有界变量)。据我了解,字段faculty和university数据库中的行。这意味着execute您需要传递一个列表或两个字符串的元组中的第二个参数。您正在传递两个元素的元组,但第一个不是字符串,而是一个元素的元组(例如,这
('КБ',)是一个字符串的元组),您在此处创建:当您对单个元素进行查询时,您将该单元素元组作为第二个参数传递给
execute,并且它起作用了,因为这正是它所execute期望的 - 与查询中的参数一样多的元素的列表或元组(在这种情况一)。当您有两个参数时,正如我上面所说,您需要传递两个元素的元组。就您而言,这意味着您需要这样做:
您还需要确保它
university_pressed包含一个包含列中值的字符串university(我仍然无法从您的回答中了解该值是什么以及它是什么类型),然后这样的调用将按预期工作: