Puede detectar la excepción OperationalError y volver a conectarse.
from MySQLdb import OperationalError
try:
my_sql_operation()
except OperationalError as e:
#do what you want to do on the error
reconnect()
print e
Si desea verificar explícitamente si la conexión se ha ido antes de ejecutar las consultas, puede ejecutar una consulta de prueba para verificar si se produce la excepción.
No estoy seguro de en qué otros casos se genera OperationalError. Pero si desea capturar solo el MySQL server has gone away
error, puede hacer algo como esto.
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()
solo detectará el error 'desaparece' y permitirá que surjan las excepciones OperationalError generadas debido a otras razones.
ACTUALIZAR
Como dije en el comentario, mi función de consulta sería así:
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)
Eso es solo un ejemplo y puede no ser adecuado para su caso. El punto que estoy tratando de hacer es que es mejor tener diferentes funciones para diferentes cosas para que puedas manejar estas situaciones fácilmente.