See Modifica nella parte inferiore per soluzione testata
Non ho provato, ma forse usando PoolListener è un modo per andare?
Si potrebbe fare qualcosa di simile:
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()])
In questo modo ogni connessione il tempo sta per essere estratto dalla piscina ci prova se è effettivamente collegato al server. In caso contrario, diamo a sqlalchemy una possibilità di riconnettersi. Dopo, se il problema è ancora lì, lo lasciamo andare.
PS: Non ho testato se funziona.
Edit: Per quanto riguarda la piloni, modifiche al motore inizializzazione mostrato sopra avrebbe bisogno di essere fatto in
your_app.model.init_model (piloni 0.9.7) o
your_app.config.environment.load_environment
(piloni 1.0) Funzione
-
Questi sono
questo è il
posti in cui viene creata l'istanza del motore
.
EDIT
Ok. Sono stato in grado di riprodurre la situazione descritta. Il codice sopra necessita di alcune modifiche per funzionare. Di seguito è come dovrebbe essere fatto. Inoltre non importa se è 0.9.7 o 1.0.
È necessario modificare your_app/config/environment.py. Mettere queste esportazioni nella parte superiore del file:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
E la fine della funzione load_environment dovrebbe essere simile che:
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)
Questa volta sono stato in grado di provarlo (su piloni 1.0 + SQLAlchemy 0,6. 1) e funziona. :)
Grazie, anima simile è qui: http://www.mail-archive.com/[email protected]/msg15079.html e funziona per me. – wRAR
Non hai visto la tua modifica :) – wRAR
Nota per SQLAlchemy 0.7 - 'PoolListener' è deprecato, ma la stessa soluzione può essere implementata usando il nuovo [sistema degli eventi] (http://docs.sqlalchemy.org/en/latest/ core/pooling.html # disconnect-movimentazione-pessimista). –