2021 Bemærk: Det originale svar er fra 2010. Nu ser den bedre tilgang, som påpeget i kommentarerne, ud til at bruge pool_recycle param .
Originalt svar fra 2010 følger.
Se EDIT nederst for testet løsning
Jeg prøvede det ikke, men brugte måske PoolListener er en vej at gå?
Du kunne gøre noget som dette:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.info() # is there any better way to simply check if connection to mysql is alive?
except sqlalchemy.exc.OperationalError:
if self.retried:
self.retried = False
raise # we do nothing
self.retried = True
raise sqlalchemy.exc.DisconnectionError
# next, code according to documentation linked above follows
e = create_engine("url://", listeners=[MyListener()])
På denne måde tester vi, hver gang forbindelsen er ved at blive tjekket ud fra puljen, om den faktisk er forbundet til serveren. Hvis ikke, giver vi sqlalchemy en chance for at oprette forbindelse igen. Efter det, hvis problemet stadig er der, lader vi det gå.
PS:Jeg testede ikke, om dette virker.
Rediger:Med hensyn til Pylons, vil ændringer af motorinitialiseringen vist ovenfor skulle udføres i your_app.model.init_model (Pylons 0.9.7) eller your_app.config.environment.load_environment (Pylons 1.0) funktion - disse er dette er places sted, hvor motorforekomsten bliver oprettet.
REDIGER
Ok. Jeg var i stand til at gengive den beskrevne situation. Ovenstående kode kræver nogle ændringer for at fungere. Nedenfor er hvordan det skal gøres. Det er også lige meget, om det er 0.9.7 eller 1.0.
Du skal redigere din_app/config/environment.py. Sæt disse eksporter øverst i filen:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
Og slutningen af load_environment-funktionen skulle se sådan ud:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.cursor().execute('select now()')
except _mysql_exceptions.OperationalError:
if self.retried:
self.retried = False
raise
self.retried = True
raise sqlalchemy.exc.DisconnectionError
config['sqlalchemy.listeners'] = [MyListener()]
engine = engine_from_config(config, 'sqlalchemy.')
init_model(engine)
Denne gang var jeg i stand til at teste det (på Pylons 1.0 + SQLAlchemy 0.6.1), og det virker. :)