Проблема с запросом данных из SQLite базы через Телеграм бот

Рейтинг: 0Ответов: 1Опубликовано: 17.02.2023

Салют господа программисты. Прошу камнями не сразу не кидать я только обучаюсь. К делу... Пытался написать бота для работы, но случился затык с выводом информации из таблицы SQLite3. Код приведу позже. После ввода номера детали бот стопорится и ничего не делает АБСОЛЮТНО ничего. Ошибок не выдает пуллинг не прекращается привожу код.

@dp.message_handler(commands=['find'])
async def dialog1_start(message: types.Message):
    # Спрашиваем номер детали
    await message.answer("Введите номер детали:")
    await Dialog2.nomer_PH.set()


@dp.message_handler(state=Dialog2.nomer_PH)
async def dialog1_nomer_PH(message: types.Message, state: FSMContext):
    # Получаем номер детали из сообщения и сохраняем его в state
    await state.update_data(nomer_PH=message.text)
    await Dialog2.prom.set()


@dp.callback_query_handler(state=Dialog2.prom)
async def search_in_db(query: types.CallbackQuery, state: FSMContext):
    data = await state.get_data()
    nomer_PH = data.get('nomer_PH')
    markup = ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add(KeyboardButton("Поиск в БД."), KeyboardButton("Отменить."))
    await query.message.answer(f"Проверьте введенные данные: {nomer_PH}\n"
                               f"Для поиска в БД нажмите соответствующую кнопку:", reply_markup=markup)

    await Dialog2.poisk_v_db.set()


@dp.message_handler(state=Dialog2.poisk_v_db)
async def dialog1_accept(message: types.Message, state: FSMContext):
    try:
        data = await state.get_data()
        nomer_PH = data.get('nomer_PH')
        if message.text == "Поиск в БД.":
            connect = sql.connect('agro.db')
            cursor = connect.cursor()
            program = cursor.execute("SELECT program FROM program_list WHERE name =?", (nomer_PH,)).fetchone()
            await message.answer(f"Поиск выполнен номер детали:{nomer_PH}\n"
                                 f"Номер программы: {program[0]}")
            connect.commit()
            connect.close()
            await state.reset_state()
        elif message.text == "Отменить.":
            await message.answer("Вы отменили поиск данных. Начните все заново с команды /add или команды /start.")
            await state.reset_state()
    except Exception as e:
        await message.answer("Произошла ошибка при выполнении операции. Попробуйте снова.")
        logging.exception(e)
        await state.reset_state() ```

Очень прошу помощи, пожалуйста ткните меня носом в ошибку. Заранее спасибо за понимание.

Ответы

▲ 0Принят

ты создаешь markup клавиатуру а не inline кнопки но при этом делаешь хендлер на inline кнопки.

и при этом ты вовсе не проверяешь текст кнопок (юзер отмену нажал или другую кнопку).

и зачем ты делаешь две отдельные хенлеры чтобы просто сохранить номер и отдельно написать юзеру сообщение(главная ошибка)...

вот исправленный код:

@dp.message_handler(commands=['find'])
async def dialog1_start(message: types.Message):
    # Спрашиваем номер детали
    await message.answer("Введите номер детали:")
    await Dialog2.nomer_PH.set()


@dp.message_handler(state=Dialog2.nomer_PH)
async def dialog1_nomer_PH(message: types.Message, state: FSMContext):
    # Получаем номер детали из сообщения и сохраняем его в state
    await state.update_data(nomer_PH=message.text)

    # клавиатура
    markup = ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add(KeyboardButton("Поиск в БД."), KeyboardButton("Отменить."))

    # отправка сообщения
    await message.answer(f"Проверьте введенные данные: {nomer_PH}\n"
                               f"Для поиска в БД нажмите соответствующую кнопку:", reply_markup=markup)

    await Dialog2.poisk_v_db.set()


@dp.message_handler(state=Dialog2.poisk_v_db)
async def dialog1_accept(message: types.Message, state: FSMContext):
    if msg.text == "Поиск в БД.": # действие когда юзер нажмёт на кнопу поиска
        try:
            data = await state.get_data()
            nomer_PH = data.get('nomer_PH')
            if message.text == "Поиск в БД.":
                connect = sql.connect('agro.db')
                cursor = connect.cursor()
                program = cursor.execute("SELECT program FROM program_list WHERE name =?", (nomer_PH,)).fetchone()
                await message.answer(f"Поиск выполнен номер детали:{nomer_PH}\n"
                                     f"Номер программы: {program[0]}")
                connect.commit()
                connect.close()
                await state.reset_state()
            elif message.text == "Отменить.":
                await message.answer("Вы отменили поиск данных. Начните все заново с команды /add или команды /start.")
                await state.reset_state()
        except Exception as e:
            await message.answer("Произошла ошибка при выполнении операции. Попробуйте снова.")
            logging.exception(e)
            await state.reset_state()
    elif msg.text == "Отменить.": # действие если юзер нажмёт отмену
        await state.finish()
        await message.answer("Всё отменено")