gpt4 book ai didi

python - 使用默认关系撤消 `lazyload()`

转载 作者:行者123 更新时间:2023-11-28 18:42:05 26 4
gpt4 key购买 nike

我有一个 Query 对象,它最初配置为 lazyload() 模型上的所有关系:

query = session.query(Article).options(lazyload('author'))

是否可以将关系加载恢复为默认值?例如。该关系是使用 lazy='joined' 配置的,我希望查询具有 joinedload() 行为,而无需显式使用 joinedload()

我期待 defaultload()具有此行为,但实际上它没有:它引用查询默认值而不是关系默认值。所以我正在寻找一种 resetload() 解决方案。


这样做的原因是因为我正在创建一个基于 JSON 的查询语法,除非用户明确命名它们,否则不应加载任何关系。

目前,我正在使用 lazyload()在所有未明确请求的关系上,但想反过来:lazyload() 首先是所有关系,然后为其中一些关系覆盖它。

这会使代码更直接。

最佳答案

明确一点:

By default, all inter-object relationships are lazy loading.

http://docs.sqlalchemy.org/en/latest/orm/loading.html

所以我们讨论的是这样一种情况,其中一个关系被特别标记为预加载,然后查询被配置为延迟加载,然后你想按原样“覆盖覆盖”。

options 的链接调用将覆盖之前的调用。我确实对此进行了一些测试。

q = s.query(User)  # lazy loads 'addresses'
q = s.query(User).options(contains_eager('addresses')) # eager loads
q = s.query(User).options(contains_eager('addresses'))\
.options(lazyload('addresses')) # lazy loads
q = s.query(User).options(contains_eager('addresses'))\
.options(lazyload('addresses'))\
.options(contains_eager('addresses')) # eager loads

但是,听起来您只是在谈论恢复 lazyload 选项,而上述情况涉及对预加载的显式更改。

defaultload 文档字符串说它的用例是链接到其他加载器选项,所以我认为它不相关。

根据对源代码的一瞥,我认为这种行为不受支持。当您更新加载策略选项时,它会使用新的加载策略更新字典,而且我认为仍然没有引用旧策略,至少据我所知是这样。

您可以在 .options(lazyload(...)) 之前保留对查询对象的引用,或者只可以选择在所有内容上使用或不使用惰性加载来生成查询。

关于python - 使用默认关系撤消 `lazyload()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25000473/

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