Как мне поймать _mysql_exceptions.OperationalError: 2002 в Python

0

Я использую скрипт 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

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ:

Похоже, что ошибка (-ы) исходила из другого места в коде, а там, где я смотрел. Я обновлю это сообщение позже с подробностями.

Я заметил, что он пытался получить образец вывода, чтобы добавить к этому сообщению, поэтому публикация здесь помогла мне.

Теги:
mosquitto

1 ответ

1

У вашего кода, кажется, есть стартовый пример того, как делать то, что вы спрашиваете:

except mdb.Error as ee:
...

У вас нет выбора, кроме как поймать тип исключения и проверить поля для требуемых кодов ошибок, связанных с mysql, поскольку ошибки rdbms завернуты внутри.

Из официального doc MySQLdb User Guide - MySQL-Python:

Там нет возвратного значения, но могут быть подняты исключения. Исключения определены в отдельном модуле _mysql_exceptions, но _mysql экспортирует их. Ознакомьтесь с спецификацией API DB PEP-249, чтобы узнать, что это такое, или вы можете использовать весь MySQLError.

Это хорошая идея (всегда) читать документацию.

Ещё вопросы

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