Puoi rilevare l'eccezione OperationalError e riconnetterti.
from MySQLdb import OperationalError
try:
my_sql_operation()
except OperationalError as e:
#do what you want to do on the error
reconnect()
print e
Se desideri verificare esplicitamente se la connessione è interrotta prima di eseguire le query, puoi eseguire una query di prova per verificare se si verifica l'eccezione.
Non sono sicuro in quali altri casi viene sollevato OperationalError. Ma se vuoi catturare solo il MySQL server has gone away
errore, puoi fare qualcosa del genere.
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()
rileverà solo l'errore "andato via" e consentirà di sollevare eccezioni OperationalError per altri motivi.
AGGIORNAMENTO
Come ho detto nel commento, la mia funzione di interrogazione sarebbe questa:
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)
Questo è solo un esempio e potrebbe non essere adatto al tuo caso. Il punto che sto cercando di sottolineare è che è meglio avere funzioni diverse per cose diverse in modo da poter gestire facilmente queste situazioni.