我在Pyramid系统中使用SQLAlchemy。我使用事务管理器(zope)并添加一个名为'db_session'的request_method,因此request.session可以用来进行查询。
这在视图中很好,但对于我的SQLAlchemy对象本身的函数,我使用inspect(self).session来获取会话。据我所知,这是相当普遍的。
现在我希望能够从SQLAlchemy对象的classmethods访问我的zope事务会话。在尝试了各种各样的事情后,我意识到我必须在 init .py中的includeme()函数中将我的元类Base.query设置为Session.query_property()。基本上这个: -
def includeme(config):
settings = config.get_settings()
# use pyramid_tm to hook the transaction lifecycle to the request
config.include('pyramid_tm')
session_factory = get_session_factory(get_engine(settings))
factory = scoped_session(session_factory)
config.registry['dbsession_factory'] = factory
Base.query = factory.query_property()
# make request.dbsession available for use in Pyramid
config.add_request_method(
# r.tm is the transaction manager used by pyramid_tm
lambda r: get_tm_session(session_factory, r.tm),
'dbsession',
reify=True
)
'Base'这是我的元类。
这就是我想要的,但我意识到我在使用它时使用的是python全局变量。我还没有走得太远,但这是否会导致将来出现问题(尤其是可测试性问题)?我很确定它对我想要做的事情“有效”(类方法对当前会话具有固有的访问权限,而不必将其传递给它们)。