sno*_*y91 6 python session sqlalchemy
AttributeError: 'scoped_session' object has no attribute '_autoflush'尝试在SQLAlchemy ORM中的scoped_session上执行预建查询时,收到一个奇怪的错误。
我正在使用上下文管理器来产生scoped_session,
@contextmanager
def connect(my_session_factory):
session = scoped_session(my_session_factory)
try:
yield session
except Exception as exception:
session.rollback()
raise exception
finally:
session.close()
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
from sqlalchemy.orm import Query
query = Query(my_model).offset(my_offset).limit(my_limit)
with connect(my_session_factory) as session:
instances = query.with_session(session).all()
return instances
Run Code Online (Sandbox Code Playgroud)
但是,这引发了上面的例外。
我还注意到,对表格的查询session.query(my_model)工作正常。
我要去哪里错了?非常感谢!
好吧 - 我对所提出的问题没有答案,但我似乎有一个解决方法。
问题似乎与scoped_session对象的代理行为有关。据我了解,该scoped_session()方法采用一个sessionmaker对象并使用它来创建线程本地session对象。但是,该scoped_session()方法不会返回此线程本地session。相反,它返回一个scoped_session以某种方式(我不太清楚)容纳 thread-local 的对象session。要直接访问此线程本地会话,您可以执行scoped_session.registry(),或者简单地执行以下操作scoped_session(),其中scoped_sessionHere 是该方法返回的scoped_session 对象scoped_session。
my_scoped_session = scoped_session(my_session_factory)
my_local_session = my_scoped_session()
Run Code Online (Sandbox Code Playgroud)
现在的问题是:文档似乎表明,由于对象的代理行为,诸如my_scoped_session.query(...).all()和之类的调用是等效的。我发现这在很大程度上是正确的,但在我最初的问题案例中却并非如此。my_local_session.query(...).all()scoped_session
如果您这样做my_query = Query(...)(即构建一个非会话绑定查询),然后将其附加到一个scoped_session对象(希望利用scoped_session代理机制,以便在thread-localmy_query的上下文中处理),通过或类似,您可以在我原来的问题中得到回溯。scoped_sessionsessionmy_instances = my_query.with_session(my_scoped_session).all()
我的解决方法是完全跳过scoped_session对象的代理机制,而是my_query直接将对象绑定到my_local_session.
my_query = Query(...).filter(...).sort(...)
my_instances = my_query.with_session(my_local_session).all()
Run Code Online (Sandbox Code Playgroud)
这似乎可行。然而,如果有人愿意插话scoped_session(my_session_factory)()直接使用而不是使用scoped_session(my_session_factory)(大多数在线教程似乎都是这样做的)的危险(如果有的话?),那么我将不胜感激!
| 归档时间: |
|
| 查看次数: |
863 次 |
| 最近记录: |