Você pode capturar a exceção OperationalError e reconectar.
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 você deseja verificar explicitamente se a conexão foi interrompida antes de executar as consultas, você pode executar uma consulta de teste para verificar se a exceção ocorre.
Não tenho certeza em quais outros casos OperationalError é gerado. Mas se você quiser pegar apenas o
MySQL server has gone away
erro, você pode fazer algo assim. 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()
ele detectará apenas o erro 'fora' e permitirá que exceções OperationalError sejam levantadas devido a outros motivos.
ATUALIZAÇÃO
Como eu disse no comentário minha função de consulta seria assim:
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)
Isso é apenas um exemplo e pode não ser adequado para o seu caso. O ponto que estou tentando fazer é que é melhor ter funções diferentes para coisas diferentes, para que você possa lidar com essas situações facilmente.