1

在服务器上,我使用 Tornado 和 SQLAlchemy 的组合(也许 SQLAlchemy 不是异步服务器的最佳选择,但它是临时的)我将项目和处理程序拆分为 10 个文件/模块。在我使用session = Session()session查询数据库的每个模块中。

每个模块的公共部分看起来像

...
import tornado.ioloop

engine = create_engine(DB_URL, echo=False, pool_size=100, pool_recycle=3600)
Session = sessionmaker(bind=engine)


class BaseHandler(tornado.web.RequestHandler):
 ....

我需要以某种方式设置

engine = create_engine(DB_URL, echo=False, pool_size=100, pool_recycle=3600)
Session = sessionmaker(bind=engine)

像单身一样,不要在每个模块中创建,或者这是做事和创建会话的好方法。

4

1 回答 1

2

您可能希望使用scoped_session它本质上用作线程本地单例,使用提供的工厂函数按需创建会话。

在所有其他人导入的一个模块中,您编写:

engine = create_engine(DB_URL, echo=False, pool_size=100, pool_recycle=3600)
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)
# or make it a Tornado Application property

然后要么Session用作显式工厂:

session = Session()
session.query(...)

或者使用隐式方法委托:

Session.query(...)
于 2013-08-12T04:10:01.833 回答