Пишу телеграм бота с БД MySQL. Появляется ошибка - MySQL Connection not available"
Использую библиотеку pyTelegramBotAPI + python 3.7.6 (Windows 10). Я написал достаточно огромный код, и в нём есть большое количество sql-запросов. Ошибка появляется, когда вовремя не выполняется sql-запрос. Я попытался открывать/закрывать курсор после каждого запроса, и это только частично решило мою проблему. Как можно реализовать в коде, чтобы sql-запрос всегда завершался, прежде чем пользователь сделает какие-либо действия, то есть добавить какое-то явное ожидание? Приведу пример в коде.
Так как всё происходит в бесконечном цикле бота - то кнопки в моём коде постоянно "прослушиваются". И если пользователь нажмет быстро на две кнопки сразу - произойдет ошибка.
if message.text == 'Пример 1':
cursor = db.cursor()
sql = "INSERT INTO orders (user_id,item) VALUES (%s,%s)"
val = (message.chat.id ,'Пример 1')
result = cursor.execute(sql, val)
db.commit()
cursor.close()
return next(message)
elif message.text == 'Пример 2':
cursor = db.cursor()
sql = "INSERT INTO orders (user_id, item) VALUES (%s,%s)"
val = (message.chat.id,'Пример 2')
result = cursor.execute(sql, val)
db.commit()
cursor.close()
return for_shop(message)
Ответы (1 шт):
Оказалось всё намного проще. Для любителей быстро нажимать на кнопки я предусмотрел блок исключений try-except.
Может кому-то пригодится - насчет sql-запросов я решил переключить бота в однопоточный режим, так как мой бот ориентирован на небольшое количество пользователей:
bot = telebot.TeleBot('your token', threaded=False). Это если пойти простым путём и не заморачиваться.
UPD. Решение всё-таки нашлось!!! Думаю это точно кому-то пригодится. Если бот работает у вас в многопоточном режиме - достаточно взять ваше подключение к БД в функцию и вызывать перед sql-запросом (где ожидается большое количество изменений/удалений в БД)
def conn():
db = mysql.connector.connect(
host = "your host",
user = "user",
passwd = "your pswd",
port = "your port",
database = "example"
)
return db
...
...
db = conn()
cursor = db.cursor()
sql = "INSERT INTO orders (user_id, item) VALUES (%s,%s)"
val = (message.chat.id,'Пример 1')
result = cursor.execute(sql, val)
db.commit()