@Sadons

Как правильнее записать код определения какую inline кнопку нажал пользователь?

Всем привет)
Есть динамическая система создания заданий, затем созданные создания сохраняются в БД, и когда пользователь в телеграм боте нажимает кнопку заданий
0NaKb7g.png
Путём цикла перебора я показываю пользователю все возможные задания в инлайн кнопках
kb_tasks = InlineKeyboardMarkup(row_width=1)
    for i in range(len(tasks)):
            btn_task = InlineKeyboardButton(f"{tasks[i][0]}", callback_data=f'task.{i}')
            kb_tasks.add(btn_task)
    await message.answer(f"<b>Задания доступные для вас\nЧто бы выбрать нажмите на интересующее</b>",
                         reply_markup=kb_tasks, parse_mode="html")

Тут я указываю для каждой кнопки коллбэк дата
callback_data=f'task.{i}
, т.е task.0, task.1 и так далее по их последовательности в БД
Теперь, я ловлю коллбэки таким образом
async def select_task(call: types.CallbackQuery):
    tasks = await sql.fetch("SELECT name FROM tasks")
    for i in range(len(tasks)):
        if call.data == f'task.{i}':
            await bot.send_message(call.message.chat.id, f"Ты выбрал задание №{i}")

Данный код работает исправно, но думаю что это неправильно
То есть каждый раз когда пользователь нажимает инлайн кнопку тоедело запускается цикл и проходит по всем коллбэкам = task.0, task.1 и так до кол-ва заданий в БД пока не найдет нужный, скажется ли это как нибудь на производительности бота? И как можно записать данный код по другому?
В плане производительности я не имею ввиду супер скорость, но думаю что если пользователей будет хотя бы 10 и заданий 20-30 то это будет жутко лагать
Извиняюсь заранее за большое кол-во текста, так как думаю что так будет понятнее что я хочу сделать
Возможно, написал бред и спрашиваю тоже бред, этого не исключаю)
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
@twistfire92
Python backend developer
Лагать не будет. Мне кажется даже с обходом 1000 кнопок вы не увидете задержек.
Проблема в самом подходе.
Первое - вытаскивать все имена из БД чтобы потом посчитать сколько их было - ну такое себе. Гуглим SQL COUNT
Второе - если из строки task.8 нужно вытащить 8, то это проще сделать через split
call.data.split('.')[1]
И никакие циклы там не нужны (в данном случае и запрос в БД тоже не нужен).

Подучите больше основ чтобы не выполнять лишних действий.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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