Możesz złapać wyjątek OperationalError i połączyć się ponownie.
from MySQLdb import OperationalError
try:
my_sql_operation()
except OperationalError as e:
#do what you want to do on the error
reconnect()
print e
Jeśli chcesz wyraźnie sprawdzić, czy połączenie zostało zerwane przed uruchomieniem zapytań, możesz uruchomić zapytanie testowe, aby sprawdzić, czy występuje wyjątek.
Nie jestem pewien, w jakich innych przypadkach zgłaszany jest błąd OperationalError. Ale jeśli chcesz przechwycić tylko MySQL server has gone away
błąd, możesz zrobić coś takiego.
from MySQLdb import OperationalError
try:
my_sql_operation()
except OperationalError as e:
if 'MySQL server has gone away' in str(e):
#do what you want to do on the error
reconnect()
print e
else:
raise e()
przechwyci tylko błąd „odeszło” i pozwoli na zgłoszenie wyjątków OperationalError zgłoszonych z innych powodów.
AKTUALIZUJ
Jak powiedziałem w komentarzu, moja funkcja zapytań wyglądałaby tak:
def fetch_data(query):
try:
cursor = conn.Cursor()
cursor.execute(query)
return cursor.fetchall()
except OperationalError as e:
reconnect()
print 'reconnecting and trying again...'
fetch_data(query)
To tylko przykład i może nie być odpowiedni w twoim przypadku. Chodzi mi o to, że lepiej mieć różne funkcje dla różnych rzeczy, aby łatwo poradzić sobie z takimi sytuacjami.