Elo*_*off 6 python sqlalchemy python-elixir
我不确定scoped_session是如何工作的,除了它似乎是一个隐藏几个真实会话的包装器,使它们分开以满足不同的请求.它是否与线程本地人一起使用?
无论如何麻烦如下:
S = elixir.session # = scoped_session(...)
f = Foo(bar=1)
S.add(f) # ERROR, f is already attached to session (different session)
Run Code Online (Sandbox Code Playgroud)
不确定f在不同的会话中是如何结束的,我之前没有遇到任何问题.在其他地方,我的代码看起来就像那样,但实际上是有效的.你可以想象我发现这很令人困惑.
我在这里什么都不知道,f似乎神奇地添加到构造函数中的一个会话中,但我似乎没有对它使用的会话有任何引用.为什么它会在不同的会话中结束?我怎样才能让它在正确的会话中结束?这个scoped_session的东西怎么样?它有时似乎有效,有时则不然.
我当然很困惑.
Scoped会话创建一个代理对象,该对象保留(通过默认情况下)每个线程会话对象的注册表,这些对象是根据传递的会话工厂创建的.当您访问会话方法时,ScopedSession.add它会找到与当前线程对应的会话,并返回add绑定到该会话的方法.可以使用该ScopedSession.remove()方法删除活动会话.
ScopedSession有一些方便的方法,一个是query_property创建一个属性,该属性返回一个查询对象,该查询对象绑定到它所创建的作用域会话以及它被访问的类.另一种ScopedSession.mapper是添加默认__init__(**kwargs) 构造函数,默认情况下将创建的对象添加到创建映射器的作用域会话中.可以通过save_on_init映射器的关键字参数来控制此行为.ScopedSession.mapper因为问题中存在的问题而被弃用.这是Python"明确优于隐式"哲学的一种情况.不幸的是,Elixir仍默认使用ScopedSession.mapper.
| 归档时间: |
|
| 查看次数: |
3215 次 |
| 最近记录: |