作为SQLAlchemy的新手,我想知道应该在什么时候调用Session()
,比如一个视图。是应将其定义为全局变量,还是应为每个请求创建新会话。
答案 0 :(得分:9)
我强烈建议您关注Pyramid SQLAlchemy tutorial。它教你如何在一个简单的Wiki应用程序中使用SQLAlchemy和Pyramid。
您将注意到创建了models.py
模块的教程,该模块定义了DBSession
项。这使您可以访问SQLAlchemy会话,其范围限定为Pyramid线程并绑定到Pyramid事务模型,并在需要会话时导入:
from pyramid.view import view_config
from .models import (
DBSession,
MyModel,
)
@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):
one = DBSession.query(MyModel).filter(MyModel.name=='one').first()
return {'one':one, 'project':'tutorial'}
在models.py
中,DBSession变量定义如下:
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
from zope.sqlalchemy import ZopeTransactionExtension
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
注意ZopeTransactionExtension
; Pyramid会自动为每个请求启动一个新事务,将其提交给成功的响应,并在发生异常时将其中止。这使您免除了大多数交易处理职责。当您需要查看数据库更新时(例如自动递增主键),只需记住.flush
您的会话。
同样,本教程将扩展所有这些以及更多内容。
答案 1 :(得分:1)
实际上,在阅读了一些sqlalchemy文档后,我找到了我的问题的正确答案,其中应该为每个请求创建一个新的上下文会话。见http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#lifespan-of-a-contextual-session