作为 SQLAlchemy 的新手,我想知道什么时候 Session()
应该调用一个视图。它应该被定义为一个全局变量,还是应该为每个请求创建一个新的会话。
问问题
1850 次
2 回答
9
我强烈建议您遵循Pyramid SQLAlchemy 教程。它教你如何在一个简单的 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
当您需要查看数据库更新(例如自动递增主键)时,请记住您的会话。
同样,本教程对所有这些以及更多内容进行了扩展。
于 2012-07-04T20:14:14.117 回答
1
实际上,在阅读了更多 sqlalchemy 文档之后,我找到了我的问题的正确答案,每个请求都应该创建一个新的上下文会话。请参阅http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#lifespan-of-a-contextual-session
于 2012-07-05T19:49:27.473 回答