Почему 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,)), и не забывайте про обработку исключений. После исправления этих ошибок бот будет корректно сохранять, искать, обновлять и удалять записи о багах.