Как переподключиться к mysql после получения сообщения mqtt в python?

0

Я использую python для подписки на одну тему, разбора JSON и сохранения их в базе данных. У меня проблемы с потерей связи с MySQL, потому что он не может быть открыт слишком долго. Сообщение, которое я получаю, ниже

_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')

Мне удалось удалить его, увеличив тайм-аут, но это не очень хорошее решение, потому что я не знаю, сколько времени системе придется ждать сообщения. Есть ли возможность создать соединение только при получении сообщения?

я попытался добавить данные о соединении в сообщение, а затем закрыть его, но у меня все еще есть одна и та же проблема

def on_message(client, userdata, msg):

sql = "" "INSERT INTO data (something) VALUES (% s)" "" data = ("некоторое значение") с db: try: cursor.execute(sql, data), кроме MySQLdb.Error: db.ping(True ) cursor.execute(sql, data) за исключением: print ("error") print (cursor._last_executed)

но тогда эта переменная не видна вне этой функции. Какова наилучшая практика для этого.

Часть кода для подключения ниже

import paho.mqtt.client as mqtt
import MySQLdb
import json
import time
#mysql config
try:
    db = MySQLdb.connect(host="localhost",  # your host 
                     user="admin",       # username
                     passwd="somepass",     # password
                     db="mydb")   # name of the database
except:
    print("error")

Итак, как вы видите, я создал одно соединение с mysql при попрошайничестве, и если нет сообщения для времени дольше определенного таймаута, мой скрипт перестает работать.

Теги:
mqtt

1 ответ

1
Лучший ответ

Пытаться:

cur = db.cursor()
try:
    cur.execute(query, params)
except MySQLdb.Error:
    db.ping(True)
    cur.execute(query, params)

db.ping(True) говорит, что для повторного подключения к DB соединение было потеряно. Вы также можете вызвать db.ping(True) сразу после MySQLdb.connect. Но, чтобы быть в безопасности, я лучше завершу execute() в try и вызову db.ping(True) в except блока.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню