Pylons与Pyramid的会话差异

7 投票
2 回答
4506 浏览
提问于 2025-04-16 17:52

作为一个Pylons的用户,我现在想转到Pyramid,并试图理解它们之间的区别。

在Pylons中,我习惯在 myproj.model.meta 中定义会话(Session),像这样:

Session = scoped_session(sessionmaker())

然后在 myproj.model 中导入它,以定义模型等等,然后在应用程序中引用:

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

现在使用Pyramid中的默认模板(pyramid_routesalchemy),我像之前一样定义会话(只是把它叫做 DBSession 并添加了一个扩展):

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

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

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

这是为什么呢?它们有什么区别?


此外,Pyramid和Pylons之间的区别是什么呢?

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

与Pylons相比

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

2 个回答

0

为了说明一下,使用 dbsession.flush() 对我来说效果很好(这会让会话提交),而且我不需要处理任何额外的导入。

10

其实,你查找 sqlalchemy 会话实例来进行查询的方式,跟 pylons 或 pyramid 没什么关系。虽然 pylons 可能建议过某种方式作为“标准”的 pylons 方法,但这并不是重点。你获取会话的方式,主要的区别在于使用了 ZopeTransactionExtension 的例子。

ZopeTransactionExtension 是一个小工具,它确保每个打开的会话都加入一个活跃的事务。所以如果你打开了 5 个会话,它们都会加入同一个事务。这样一来,如果你提交或回滚这个事务,5 个会话所做的所有工作都会一起处理。这里的事务模块(“transaction.commit()”)是关键。

pyramid_tm 试图让设置事务变得简单……它在请求开始时就启动一个事务,所有作用域内的数据库会话都会加入这个事务……然后在请求结束时,如果发现了错误,它会回滚这个事务。否则,事务就会被提交。这样,视图层的代码就不需要手动创建或关闭/提交/回滚事务了。

一般来说,session.flush() 是用来确保你的数据库模型实例能填充主键,而不需要提交事务。

所以在视图中,你只需要做的就是:

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

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

撰写回答