Почему Telegram-бот не сохраняет баги в базу данных SQLite?

    При разработке Telegram-бота для трекинга багов часто возникает ситуация: после добавления записи бот не подтверждает сохранение, данные в таблице не появляются, а команды поиска и изменения не работают. В этой статье мы детально разберём типовую ошибку в коде на Python с библиотеками telebot и sqlite3, а также предложим правильные решения.

    Основные причины проблемы

    Исходный код использует метод cursor.executemany() для вставки, выборки и обновления данных. Это частая ошибка новичков: executemany предназначен для массовой вставки списка кортежей, а не для единичных операций. В результате запрос выполняется некорректно, и данные не сохраняются.

    Ошибка в команде /add_bug

    В функции process_developer используется cursor.executemany('INSERT INTO bugs ...', (bug_name_var, bug_info_var, developer)). Правильный синтаксис для одной записи - cursor.execute(). Кроме того, второй аргумент должен быть кортежем, а не просто скобками. Исправленный вариант:

    cursor.execute('''INSERT INTO bugs (bug_name, bug_info, developer) VALUES (?, ?, ?)''', (bug_name_var, bug_info_var, developer))

    Ошибка в команде /view_bug

    Аналогичная проблема: cursor.executemany('SELECT * FROM bugs WHERE bug_name=?', (bug_name,)). Метод executemany не возвращает результат через fetchone(). Необходимо заменить на cursor.execute():

    cursor.execute('SELECT * FROM bugs WHERE bug_name=?', (bug_name,))

    Проблемы с глобальными переменными

    В коде используются глобальные переменные bug_name_var и bug_info_var. Это может привести к путанице при параллельных запросах от разных пользователей. Рекомендуется передавать данные через bot.register_next_step_handler с использованием словаря или лямбда-функций.

    Отсутствие обработки ошибок

    База данных может быть заблокирована, таблица не создана, или возникнет конфликт уникальности (поле bug_name объявлено как UNIQUE). Добавьте блоки try-except для отлова исключений sqlite3.IntegrityError и других.

    Полный исправленный код для /add_bug

    def process_developer(message):
        developer = message.text
        try:
            cursor.execute('''INSERT INTO bugs (bug_name, bug_info, developer) VALUES (?, ?, ?)''', (bug_name_var, bug_info_var, developer))
            conn.commit()
            bot.send_message(message.chat.id, 'Баг успешно сохранён.')
        except sqlite3.IntegrityError:
            bot.send_message(message.chat.id, 'Баг с таким именем уже существует.')
        except Exception as e:
            bot.send_message(message.chat.id, f'Ошибка: {e}')

    Заключение

    Для стабильной работы Telegram-бота с SQLite всегда используйте cursor.execute() для одиночных запросов, передавайте кортеж с одним элементом через запятую (например, (value,)), и не забывайте про обработку исключений. После исправления этих ошибок бот будет корректно сохранять, искать, обновлять и удалять записи о багах.

    Часто задаваемые вопросы