根据SQLAlchemy邻接列表关系构造整个树

问题描述

|| 我有一个带有自引用映射\'children \'(backref \'parent \')的类Node,它表示SQLAlchemy中的一棵树,我想选择整个树。如果我做
session.query(Node).all()
然后对node.children的每次访问都会触发一个选择。如果我加入了负载
session.query(Node).options(joinedload_all(\'children\')).all()
那么发出的sql有不必要的表联接,因为无论如何我都希望整个树(所有节点)。在SA中有什么方法可以做到这一点,还是我应该在SA之外自己构建树?     

解决方法

父属性没有问题,因为所需的所有信息已加载到对象中。 SQLAlchemy只需在会话中查找父对象,然后仅在缺少该对象时才发出查询。但这不适用于子代:库无法确保所有子代对象都已在会话中。因此,您可以自己构造树并通过SQL2ѭ指示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])
    

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...