在zope transaction_manager系统中实现基于类的查询(query_property),这是可测试的吗?

时间:2017-12-08 10:13:58

标签: python session sqlalchemy pyramid

我在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全局变量。我还没有走得太远,但这是否会导致将来出现问题(尤其是可测试性问题)?我很确定它对我想要做的事情“有效”(类方法对当前会话具有固有的访问权限,而不必将其传递给它们)。

0 个答案:

没有答案