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