使用关系defau撤消“lazyload()”

2024-05-16 06:07:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

是否可以将关系加载恢复为默认值?E、 g.关系是用lazy='joined'配置的,我希望查询具有joinedload()行为,而不显式使用joinedload()。在

我原以为^{}会有这种行为,但事实上它没有:它引用查询默认值而不是关系默认值。所以我在寻找一种解决方案。在


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

目前,我在所有没有显式请求的关系上使用^{},但是我想反过来:lazyload()首先是所有关系,然后为其中一些关系重写它。在

这会使代码更加疏远。在


Tags: 对象模型关系sessionarticle原因解决方案query
2条回答

我想说清楚:

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选项,而上面的例子涉及到对立即加载的显式更改。在

defaultloaddocstring表示,它的用例将被链接到其他加载程序选项,因此我不认为这是相关的。在

基于对源代码的浏览,我认为这种行为不受支持。当你更新加载策略选项时,它会用新的加载策略更新一个字典,我认为至少据我所知,仍然没有对旧策略的引用。在

您可以在.options(lazyload(...))之前保留对查询对象的引用,也可以选择生成查询,无论是否对所有内容进行延迟加载。在

要强制所有内容延迟加载,忽略在关系上指定的内容,可以使用'*'目标。来自the docs

affecting all relationships not otherwise specified in the query. This feature is available by passing the string '*' as the argument to any of these options:

session.query(Article).options(lazyload('*'))

然后,可以为每个关系或关系链指定所需的任何负载类型。在

# not sure how you are mapping json data to relationships
# once you know the relationships, you can build a list of them to load
my_loads = [joinedload(rel) for rel in json_rel_data]
query = session.query(Article).options(lazyload('*'), *my_loads)
# query lazy loads **everything** except the explicitly set joined loads

如果出于查询目的而加入关系,则可以在选项中使用contains_eager而不是{}来使用已经联接的关系。在

^{pr2}$

相关问题 更多 >