【发布时间】:2020-12-26 14:43:46
【问题描述】:
我有许多模型必须使用彼此之间的关系链接。我的代码is very complicated 所以我无法在查询后保持会话活跃。相反,我尝试预加载所有对象:
def db_get_structure():
with Session(my_engine) as session:
deps = {x.id: x for x in session.query(Department).all()}
...
return (deps, ...)
def some_logic(id):
struct = db_get_structure()
return some_other_logic(struct.deps[id].owner)
但是,不管所有对象都已加载,我还是会收到以下错误:
sqlalchemy.orm.exc.DetachedInstanceError:父实例
未绑定到会话;属性“所有者”的延迟加载操作无法继续
是否可以将预加载的对象相互链接,以便在会话关闭后关系仍然有效?
我知道joined queries (.options(joinedload(),但是这种方法会导致更多的代码行和更大的数据库请求,我认为这应该更简单地解决,因为所有对象都已经加载到 Python 对象中。
现在甚至可以请求像struct.deps[struct.deps[id].owner_id] 这样的相关对象,但我认为ORM 应该这样做并使用一些“缓存加载”提供更短的符号struct.deps[id].owner。
【问题讨论】:
标签: python session orm sqlalchemy