gpt4 book ai didi

python - 从SQLAlchemy邻接列表关系构造整个树

转载 作者:行者123 更新时间:2023-12-04 03:34:22 25 4
gpt4 key购买 nike

我有一个带有自引用映射'children'(backref'parent')的类Node,它表示SQLAlchemy中的一棵树,我想选择整个树。如果我做

session.query(Node).all()

然后对node.children的每次访问都会触发一个选择。如果我加入了负载
session.query(Node).options(joinedload_all('children')).all()

那么发出的sql有不必要的表联接,因为无论如何我都希望整个树(所有节点)。在SA中有什么方法可以做到这一点,还是我应该在SA之外自己构建树?

最佳答案

父属性没有问题,因为所需的所有信息均已加载到对象中。 SQLAlchemy只需在 session 中查找父对象,然后仅在丢失时才发出查询。但这不适用于子级:库无法确保所有子级对象都已在 session 中。因此,您可以自己构造树并通过 set_committed_value 指示SQLAlchemy使用此数据:

from collections import defaultdict
from sqlalchemy.orm.attributes import set_committed_value

nodes = session.query(Node).all()

# Collect parent-child relations
children = defaultdict(list)
for node in nodes:
if node.parent:
children[node.parent.id].append(node)

# Set collected values
for node in nodes:
set_committed_value(node, 'children', children[node.id])

关于python - 从SQLAlchemy邻接列表关系构造整个树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5680459/

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