Rozmawiano na ten temat, a ten dokument całkiem ładnie opisuje problem, więc zastosowałem zalecane przez nich podejście do obsługi takich błędów:http://discorporate.us/jek/talks/SQLAlchemy-EuroPython2010.pdf
Wygląda mniej więcej tak:
from sqlalchemy import create_engine, event
from sqlalchemy.exc import DisconnectionError
def checkout_listener(dbapi_con, con_record, con_proxy):
try:
try:
dbapi_con.ping(False)
except TypeError:
dbapi_con.ping()
except dbapi_con.OperationalError as exc:
if exc.args[0] in (2006, 2013, 2014, 2045, 2055):
raise DisconnectionError()
else:
raise
db_engine = create_engine(DATABASE_CONNECTION_INFO,
pool_size=100,
pool_recycle=3600)
event.listen(db_engine, 'checkout', checkout_listener)