SqlAlchemy + Tornado:在回滚无效事务之前无法重新连接

Big*_*Big 7 python mysql sqlalchemy web-applications tornado

我正在用龙卷风+ sqlalchemy建立一个webapp,绝对随机我得到了这个错误

     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
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何解决这个问题.我把所有db.com变成了一个

try:
  self.db.commit()
except Exception(e):
  self.db.rollback()
Run Code Online (Sandbox Code Playgroud)

那是我的班级申请.

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)
Run Code Online (Sandbox Code Playgroud)

但没什么.为mysql + php等网络应用配置sqlalchemy和tornado的最佳方法是什么?

Pil*_*ill 2

我记得不久前也遇到过同样的问题。似乎有一些与连接池相关的奇怪的东西。禁用池似乎解决了这个问题。总的来说,这不是最好的主意,但它确实有效。

尝试传递poolclass=NullPoolcreate_engine

...
from sqlalchemy.pool import NullPool
...
engine = create_engine(options.db_path, convert_unicode=True, echo=options.debug, poolclass=NullPool)
Run Code Online (Sandbox Code Playgroud)