在SQLAlchemy的scoped_session问题 - 它是如何工作的?(Issues wit

2019-07-04 02:01发布

我真的不知道scoped_session是如何工作的,除了它似乎隐藏了一些真正的会话的包装,保持它们分开为不同的请求。 这是否与线程局部变量做到这一点?

反正麻烦的是如下:

S = elixir.session # = scoped_session(...)
f = Foo(bar=1)
S.add(f) # ERROR, f is already attached to session (different session)

不知道如何F IN不同的会议结束了,我以前没使用过的问题。 在其他地方我有一些代码,看起来就像是,但实际工作。 你可以想像我觉得很混乱。

我只是不知道这里什么,F似乎奇迹般地加入到在构造函数中的会话,但我似乎并没有把它使用的会话的任何引用。 为什么最终会在不同的会话? 我怎样才能得到它在正确的会话结束了? 请问这个scoped_session东西的工作呢? 这似乎只是有时工作,和其他时间少了点。

我的确很困惑。

Answer 1:

作用域会话创建每次根据传入的会话工厂需求创建的线程会话对象保存的注册表(默认)的代理对象。 当你访问会话的方法,如ScopedSession.add找到对应于当前线程的会话,并返回add绑定到该会话的方法。 活动会话可以使用被移除ScopedSession.remove()方法。

ScopedSession有几个方便的方法,一种是query_property创建返回绑定到创建它的作用域会话,它被访问的类的查询对象的属性。 另一种是ScopedSession.mapper ,增加了一个默认的__init__(**kwargs)构造函数和默认添加创建的对象的映射创建关闭范围的会议。 这种行为可以被控制save_on_init关键字参数映射器。 ScopedSession.mapper是因为正是在这个问题的问题弃用。 这是一个情况下蟒“明确优于隐式”的理念真正应用。 不幸的是灵药还是默认使用ScopedSession.mapper



Answer 2:

原来仙丹套保存-上的init =上创建的映射器真。 这可以通过禁用:

using_mapper_options(save_on_init=False)

这解决了问题。 荣誉对stepz上#sqlalchemy搞清楚发生了什么,立即回事。 虽然我仍然好奇如何scoped_session真正起作用的,因此,如果有人回答说,他们会获得信贷回答这个问题。



文章来源: Issues with scoped_session in sqlalchemy - how does it work?