Задать вопрос
@zenondd

Как обновить таблицу SQLite нажатием inline кнопки в телеграм боте?

Не могу никак заставить бота обращаться к БД нажатием inline кнопки. Функция, отвечающая за обработку inline клавиатуры, выполняется, но строки, отвечающие за БД, просто пропускает. При этом, если ту же функцию вызвать обычной клавиатурой, то все работает, как надо. Что и где я упускаю?

Привожу обсуждаемую часть кода:

from aiogram import Bot, types, executor, Dispatcher
import sqlite3
import logging

TOKEN = "_TOKEN_"
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
logging.basicConfig(level=logging.INFO)

@dp.message_handler(commands=['show']) 
async def test(message: types.Message):
    key = types.InlineKeyboardMarkup()
    b1 = types.InlineKeyboardButton(text='Test it', callback_data='testit')
    key.row(b1)
    await message.answer('Take a chance', reply_markup=key)

@dp.callback_query_handler(text='testit')
async def update(call: types.CallbackQuery): #вот эта функция не выполняется полностью
    uid = call.message.from_user.id
    conn = sqlite3.connect('db/gecko.db', check_same_thread=False)
    cursor = conn.cursor()
    cursor.execute('UPDATE table_name SET column = ? WHERE user_id = ?', ('some_text', uid))
    conn.commit()
    cursor.close()
    print('ok')

@dp.message_handler(content_types=['text']) 
async def sl(msg: types.Message): #эта функция работает прекрасно и вносит все изменения в таблицу
    if msg.text == 'sl':
        uid = msg.from_user.id
        conn = sqlite3.connect('db/gecko.db', check_same_thread=False)
        cursor = conn.cursor()
        cursor.execute('UPDATE table_name SET column = ? WHERE user_id = ?', ('some_text', uid))
        conn.commit()
        cursor.close()
        print('ok')

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)
  • Вопрос задан
  • 218 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
Замените
@dp.callback_query_handler(text='testit')
На
@dp.callback_query_handler(lambda c: c.data == 'testit')

Ваш декоратор был правильным для отслеживания KeyboardButton, но не для InlineKeyboardButton
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы