Můžete zachytit výjimku OperationalError a znovu se připojit.
from MySQLdb import OperationalError
try:
my_sql_operation()
except OperationalError as e:
#do what you want to do on the error
reconnect()
print e
Pokud chcete před spuštěním dotazů explicitně zkontrolovat, zda je připojení ukončeno, můžete spustit testovací dotaz a zkontrolovat, zda k výjimce došlo.
Nejsem si jistý, v jakých dalších případech se objevila chyba OperationalError. Ale pokud chcete zachytit pouze MySQL server has gone away
chyba, můžete udělat něco takového.
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()
zachytí pouze chybu „gone away“ a nechá vyvolat výjimky OperationalError vyvolané z jiných důvodů.
AKTUALIZACE
Jak jsem řekl v komentáři, moje funkce dotazování by byla takto:
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 je jen příklad a ve vašem případě nemusí být vhodný. Snažím se zdůraznit, že je lepší mít různé funkce pro různé věci, abyste tyto situace mohli snadno zvládnout.