python - Pylons 和 Pyramid 中的 session 差异

标签 python session sqlalchemy pylons pyramid

作为 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/

相关文章:

python - 如何在没有 28 "if"语句的情况下创建欧盟测验

node.js - Socket.io 不与 express 共享 session

c# - 浏览器关闭时的 Session_End 代码

php - 如何在 php 中禁用 session ?

python - sqlalchemy 全外连接

java - DataSift - python api - 你如何停止流?

python - Pandas 四舍五入小数不起作用

python - 可以使用 zarr 保存对象数组吗?

python - 为什么要限制 SQLAlchemy 中的数据库连接池大小?

python - 如何在 SQLAlchemy 中按算术表达式进行排序?