SQLAlchemy scoped_session:获取视图的最佳方法

时间:2013-08-25 09:41:46

标签: python session sqlalchemy decorator webapp2

我正在使用WebApp2,SQLAlchemy,Apache,PostgrSQL等创建Web应用程序。我有一个config文件,用于存储数据库凭据并使用scoped_session创建会话对象。现在我的所有视图文件都导入了这个配置文件并使用会话对象:

some_view.py
import config

def view():
   query = config.session.query(bla bla)

这种方法不是最后一种,我想使用最好的方法。

我想在这里实现的是使用 装饰器或webapp2 相关的内置方法获取会话对象的一些方法,以便在执行view函数之后会话对象关闭了。我尝试了很多方法但却无法实现。一个工作片段将受到高度赞赏。

如果有人有更好的方法,请建议。

由于

编辑-----

@javex:谢谢你的建议。我正在寻找一个装饰器类,在调用时将返回一个scoped_session对象,当工作完成时,关闭会话。这里有一个示例代码供您参考,但它不起作用。

class GetDBSession(object):
    """Decorator class to create DB session object"""
    def __init__(self):
        self.session = scoped_session(sessionmaker(bind=database_engine))

    def __exit__(self): #Dont know if it works
        self.session.close()

    def __call__(self): #Dont know if it works
        return self.session

我想这样使用它:

@GetDBSession()
def view_func():
    #work with session object here

1 个答案:

答案 0 :(得分:0)

我不太了解WebApp2,但从我得到的是你想要的东西在请求处理结束时提交并在有异常的情况下回滚。有一些解决方案,你可以适应。

首先,我建议你阅读When do I construct a Session, when do I commit it, and when do I close it?。它有一个关于框架集成的两个扩展的段落,它们特别有用:

这些将SQLAlchemy分别集成到zope事务和flask框架中。毕竟,你想要的是围绕请求处理构建一些东西:

try:
    result = handle_request(request)
    config.session.commit()
except:
    config.session.rollback()
    raise

只有在没有异常的情况下才会提交,否则它将回滚并传递异常。如何集成它取决于WebApp2以及它如何实现这种集成。许多框架提供了某种类似上面的“before-handle-after”方法:你得到一个回调来处理请求,你可以在它之前做一些事情,然后调用回调然后在它之后做一些事情。这允许这个整洁的try / except包装器。