作为 Pylons 用户,我正在尝试切换到 Pyramid,现在试图了解差异。
在 Pylons 中,我习惯于将 myproj.model.meta
中的 Session 定义为:
Session = scoped_session(sessionmaker())
然后在myproj.model
中导入定义model等在app中引用:
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(...)...
为什么?有什么区别?
另外,与 Pyramid 有什么区别
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()
最佳答案
实际上,您查找 sqlalchemy session 实例以进行查询的方式实际上与 Pylons 和/或 Pyramid 没有任何关系。 Pylons 可能建议将其中一种方法作为“标准”pylons 方式,但仅此而已。获得 session 的方式之间唯一真正的区别在于使用 ZopeTransactionExtension 的示例。
ZopeTransactionExtension 是一个小部件,它确保打开的每个 session 都加入一个事件事务。因此,如果您要打开 5 个 session ,它们将全部加入同一事务。这样,如果您提交或回滚事务,则 5 个 session 中的任何一个完成的所有工作都将随之执行。事务模块(“transaction.commit()”)是这里的关键。
pyramid_tm 试图直接设置一个事务......它在请求输入时启动一个事务,所有范围内的数据库 session 都加入它......然后在请求结束时,如果它发现错误,它将回滚交易。否则,事务将被提交。这样 View 级代码永远不必手动创建或关闭/提交/回滚事务。
主要是 session.flush() 用于确保您的数据库模型实例在不提交事务的情况下填充其主键。
所以在一个 View 中你要做的就是:
def myview(request):
session = DBsession()
session.add(model)
pyramid_tm 将确保 session 已正确提交或回滚。
关于python - Pylons 和 Pyramid 中的 session 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6042681/