【问题标题】:Session differences in Pylons and PyramidPylons 和 Pyramid 中的会话差异
【发布时间】:2011-08-27 21:54:41
【问题描述】:

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

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

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()

【问题讨论】:

    标签: python session sqlalchemy pylons pyramid


    【解决方案1】:

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

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

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

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

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

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

    pyramid_tm 将确保正确提交或回滚会话。

    【讨论】:

    • 谢谢,你说的很直接
    • 为什么现在在paster pshell 我经常得到DetachedInstanceError: Parent instance ... not bound to a Session; lazy load operation of attribute 'areas' cannot proceed 访问关系,而在Pylons paster shell 中从未遇到过这个问题以及如何解决它?谢谢
    • +1:来到这里试图弄清楚如何在请求处理结束之前获取 pk 值,同时使用自动提交。调用 DBSession.flush() 正是我需要做的 - 谢谢!
    • 如果你在金字塔中使用“request.session”而不是实例化一个新的,会有什么不同吗?
    【解决方案2】:

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

    【讨论】:

    • 对不起,但对我来说DBSession.flush() 没有提交,所以,如果不知何故,我最后不会打电话给transaction.commit(),但我只是退出 pshell 我所有的更改都丢失了......
    • 啊,pshell 有点不同。我最近在 pshell 中遇到了与 session/db 持久性类似的问题。 pshell 确实使用与serve 相同的代码路径;请求处理和其他内部管道的配置不同,请求永远不会真正完成或在 pshell 中触发。这可能就是您需要显式使用事务管理器的原因。
    • 对我来说似乎很奇怪的是只有我在抱怨这个......其他 pshell 用户如何忍受这个?谜团……^^
    • @neurino 您的问题的一个可能答案是您可以通过命令行参数设置或在配置文件中添加的 pshell 扩展[0]。此外,还可以制作您自己的脚本[1],这是一种与日常任务的数据交互的便捷方式。 [0] docs.pylonsproject.org/projects/pyramid/en/latest/narr/… [1] docs.pylonsproject.org/projects/pyramid/en/latest/narr/…
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多