o我需要以某种方式设置create_engine put in singleton与singleton一样?

时间:2013-08-11 12:48:46

标签: sqlalchemy

在服务器上我使用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)

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

1 个答案:

答案 0 :(得分: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(...)