gpt4 book ai didi

python - SQLAlchemy 中的 UnboundExecutionError

转载 作者:行者123 更新时间:2023-11-28 17:52:02 31 4
gpt4 key购买 nike

注意:这是在 SQLAlchemy 0.5.7 中。看来这是不可能的,因为“惰性”不适用于一对一映射。如果确实如此并且我弄错了,请张贴您的答案。


我有以下方法,它应该返回父类是 Parent 的任何类的所有实例。请注意,类 Child 有一个名为 fubar 的属性,这是另一个类。我已将它们正确地映射到别处。

def get_all(self):
session = self.__Session()
lst = session.query(Parent).with_polymorphic('*').all()
#print lst # <-- this commented back in and it all works.
session.expunge_all()
session.close()
return lst

然后我可以执行诸如 for item in get_all(): [...] 之类的操作。在 child 的映射中,我有 lazy-False,所以我假设它可以正常加载。但是,如果我留下注释的打印行,我得到的只是这个异常:

UnboundExecutionError: Parent instance <Child at 0xa1bca4c> is not bound to a Session; lazy load operation of attribute 'fubar' cannot proceed

我不明白的是:当打印行在那里时,对象确实加载得很好。

我做错了什么?

编辑:感谢@van,我认为 fubar 对象确实是以惰性方式加载的。我在映射中有以下内容:

sqlalchemy.orm.mapper(Child, tb_child, inherits=Parent, 
polymorphic_identity='Child', properties={'fubar':
sqlalchemy.orm.relation(Child,
lazy=False,
uselist=False,
cascade="all, delete-orphan")
}
)

父级的代码是这样的:

sqlalchemy.orm.mapper(Parent,
tb_parent,
polymorphic_on=tb_parent.c.type,
polymorphic_identity='Parent')

这是怎么回事?...

或者,我如何强制 query() 以非惰性方式加载所有内容?

最佳答案

来自 Relationship API documentation (向下滚动到 lazy 参数的解释):

lazy=’select’ – specifies how the related items should be loaded. Default value is select. Values include:
...
noload - no loading should occur at any time. This is to support “write-only” attributes, or attributes which are populated in some manner specific to the application.
...
True - a synonym for ‘select’
False - a synonyn for ‘joined’
None - a synonym for ‘noload’

因此,通过设置 lazy=None,您实际上并没有将关系配置为预先加载,而是得到几乎相反的结果。您应该改用以下之一:立即查询、连接查询或子查询

edit-1:鉴于使用 SA-0.5 的事实:我不确定为什么不急切加载关系,但您可以尝试在查询中明确指定它并且看看它是否有效:

lst = (session.query(Parent).with_polymorphic('*').
options(eagerload('fubar')).all()) # confused if it is "fubar" or "ref"

关于python - SQLAlchemy 中的 UnboundExecutionError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8313914/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com