programacion - Construya todo el árbol a partir de una relación de lista de adyacencia SQLAlchemy
lista de adyacencia java (1)
No hay problema con la propiedad primaria, ya que toda la información necesaria ya está cargada en el objeto. SQLAlchemy solo tiene que buscar el objeto primario en la sesión y emitir una consulta solo cuando falta. Pero esto no funciona para los niños: la biblioteca no puede estar segura de que todos los objetos secundarios ya estén en la sesión. Para que pueda construir el árbol usted mismo e instruir a SQLAlchemy para que use estos datos a través de set_committed_value
:
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])
Tengo un nodo de clase con un mapeo autorreferencial ''hijos'' (backref ''parent'') que representa un árbol en SQLAlchemy y quiero seleccionar todo el árbol. Si lo hago
session.query(Node).all()
luego, cada acceso a node.children activa una selección. Si hago una carga unida
session.query(Node).options(joinedload_all(''children'')).all()
entonces el sql emitido tiene una unión de tabla innecesaria ya que quiero el árbol completo (todos los nodos) de todos modos. ¿Hay alguna manera de hacer esto en SA o debería simplemente construir el árbol por mi cuenta fuera de SA?