Я использую скрипт python для добавления сообщений mosquitto в таблицы MySQL, все это отлично работает, я ловил _mysql_exceptions.OperationalError: (2006, "сервер MySQL ушел"), так что скрипт продолжает работать, если есть нет сообщений более 12 часов, и я ломаю дубликаты записей времени, которые также вызвали проблемы.
Проблема в том, что когда сервер MySQL не работает по какой-либо причине, я хочу, чтобы скрипт просто не обновлял базу данных (потому что не может) и продолжал слушать следующее сообщение.
Итак, в основном, как я поймаю;
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
Это полный код, который я использую;
#!/usr/bin/python
import paho.mqtt.client as mqtt
import time
import MySQLdb as mdb
import sys
con = None
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, rc):
print time.strftime("%Y-%m-%d_%H:%M:%S")
print("Connected to localhost with result code "+str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe("testing/temp")
print("Logging testing/temp to MySQL Database")
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
dogs = msg.payload, msg.topic.replace("/","_")
sql = "INSERT INTO %s VALUES(now(), '%s')" % (dogs[1],dogs[0])
global con
try:
cur = con.cursor()
cur.execute(sql)
except AttributeError:
con = mdb.connect('localhost', 'mqttman', 'thepassword', 'mqtt');
cur = con.cursor()
cur.execute(sql)
except mdb.Error as ee:
print msg.topic, "caught" , ee
if ee[0] == 2006:
con = mdb.connect('localhost', 'mqttman', 'thepassword', 'mqtt');
cur = con.cursor()
cur.execute(sql)
if ee[0] == 1062:
time.sleep(1)
cur.execute(sql)
if ee[0] == 2002:
print "Waaaaa"
pass
except mdb.InterfaceError:
print "errors all around"
except:
print "it really bad"
con.commit()
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("mqttserver", 1883, 60)
# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
try:
client.loop_forever()
except KeyboardInterrupt:
pass
Спасибо за любую помощь.
РЕДАКТИРОВАТЬ:
Похоже, что ошибка (-ы) исходила из другого места в коде, а там, где я смотрел. Я обновлю это сообщение позже с подробностями.
Я заметил, что он пытался получить образец вывода, чтобы добавить к этому сообщению, поэтому публикация здесь помогла мне.
У вашего кода, кажется, есть стартовый пример того, как делать то, что вы спрашиваете:
except mdb.Error as ee:
...
У вас нет выбора, кроме как поймать тип исключения и проверить поля для требуемых кодов ошибок, связанных с mysql, поскольку ошибки rdbms завернуты внутри.
Из официального doc MySQLdb User Guide - MySQL-Python:
Там нет возвратного значения, но могут быть подняты исключения. Исключения определены в отдельном модуле _mysql_exceptions, но _mysql экспортирует их. Ознакомьтесь с спецификацией API DB PEP-249, чтобы узнать, что это такое, или вы можете использовать весь MySQLError.
Это хорошая идея (всегда) читать документацию.