7

作为 Pylons 用户,我现在正试图切换到 Pyramid,试图了解差异。

在 Pylons 中,我习惯于将 Session 定义myproj.model.meta为:

Session = scoped_session(sessionmaker())

然后将其导入myproj.model以定义模型等然后在应用程序中参考:

root = Session.query(MyModel).filter(...)...

现在在 Pyramid (pyramid_routesalchemy) 中使用默认模板,我像以前一样定义 Session (除了调用它DBSession并添加扩展名):

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

但在views.py我不直接使用它而是实例化它:

dbsession = DBSession()
root = dbsession.query(MyModel).filter(...)...

为什么?有什么区别?


此外,与金字塔有什么区别

import transaction
...
model = MyModel(name=u'root', value=55)
session.add(model)
session.flush()
transaction.commit()

到塔架

model = MyModel(name=u'root', value=55)
session.add(model)
session.commit()
4

2 回答 2

10

实际上,您查找 sqlalchemy 会话实例以进行查询的方式实际上与 pylons 和/或金字塔没有任何关系。塔架可能已经提出了一种作为“标准”塔架方式的方法,但仅此而已。获取会话的方式之间唯一真正的区别在于使用 ZopeTransactionExtension 的示例。

ZopeTransactionExtension 是一个确保每个打开的会话都加入一个活动事务的小部件。因此,如果您要打开 5 个会话,它们都将加入同一个事务。这样,如果您提交或回滚事务,5 个会话中的任何一个完成的所有工作都将效仿。交易模块(“transaction.commit()”)是这里的关键。

pyramid_tm 试图使设置事务变得简单......它在请求输入时启动一个事务,所有范围内的数据库会话都加入它......然后在请求结束时,如果发现错误,它将回滚事务。否则,事务将被提交。这样,视图级代码永远不必手动创建或关闭/提交/回滚事务。

session.flush() 主要用于确保您的数据库模型实例在不提交事务的情况下填写其主键。

因此,在视图中,您要做的就是:

def myview(request):
    session = DBsession()
    session.add(model)

pyramid_tm 将确保会话被适当地提交或回滚。

于 2011-05-18T12:50:48.047 回答
0

作为记录,发出 dbsession.flush() 似乎对我来说效果很好(它会导致会话提交)并且我不必处理任何额外的导入。

于 2011-08-04T13:37:31.357 回答