sql >> Database teknologi >  >> RDS >> Mysql

Håndter mysql genstart i SQLAlchemy

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. :)



  1. Kombinerer du to tabeller med sql JOIN?

  2. MySQL:Aktiver LOAD DATA LOCAL INFILE

  3. Operatør

  4. tilslut java til mysql ved hjælp af jdbc på osx