2014-10-04 10 views
7

Sto costruendo una webapp con tornado + sqlalchemy e assolutamente casuale ho ottenuto questo erroreSQLAlchemy + Tornado: non può riconnettersi fino a quando un'operazione non valida viene ripristinata

 File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 1024, in _handle_dbapi_exception 
    exc_info 
    File "/usr/lib/python3/dist-packages/sqlalchemy/util/compat.py", line 187, in raise_from_cause 
    reraise(type(exception), exception, tb=exc_tb, cause=exc_value) 
    File "/usr/lib/python3/dist-packages/sqlalchemy/util/compat.py", line 182, in reraise 
    raise value.with_traceback(tb) 
    File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 822, in _execute_context 
    conn = self._revalidate_connection() 
    File "/usr/lib/python3/dist-packages/sqlalchemy/engine/base.py", line 239, in _revalidate_connection 
    "Can't reconnect until invalid " 
sqlalchemy.exc.StatementError: Can't reconnect until invalid transaction is rolled back 

io non riesco a capire come risolvere Questo. Ho messo tutti db.commit in uno

try: 
    self.db.commit() 
except Exception(e): 
    self.db.rollback() 

Questa è la mia classe Applicazione.

class Application 
     [...] 
     engine = create_engine(options.db_path, convert_unicode=True, echo=options.debug) 
     models.init_db(engine) 
     self.db = scoped_session(sessionmaker(bind=engine)) 
     tornado.web.Application.__init__(self, handlers, **settings) 

ma niente. Qual è il modo migliore per configurare sqlalchemy e tornado per un'applicazione web come mysql + php?

+0

Anche questo è il mio problema. Con falcon framework + gevent + uwsgi – Farsheed

+0

@FaraonWEB hai risolto questo mai? – pregmatch

risposta

1

Mi ricordo di aver avuto un po 'di tempo fa. Sembra che ci fossero alcune cose strane legate al pooling delle connessioni. Disabilitare il pool sembrad per ripararlo. Non è la migliore idea in generale, ma ha funzionato.

Prova a passare a poolclass=NullPoolcreate_engine

... 
from sqlalchemy.pool import NullPool 
... 
engine = create_engine(options.db_path, convert_unicode=True, echo=options.debug, poolclass=NullPool) 
1

Il mio modo è fare rollback su rivestimento, aggiungere questo al vostro BaseHandler:

def on_finish(self): 
    if self.get_status() == 500: 
     self.db_session.rollback()