我有下面的数据库架构
class Node(Base):
__tablename__ = 'node'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('node.id'))
data = Column(String(50))
children = relationship("Node")
def get_data(self):
x = session.query(Node).options(joinedload(Node.children)).filter(Node.parent_id == None).all()
return x
问题是sqlalchemy函数get_data是延迟加载,如果有100个子节点它将发出100个sql查询但是我需要sqlalchmey来获取所有父节点及其子节点的一个sql语句。 这可能吗?
[更新]
我有以下用于显示节点及其子节点的递归函数
def get_tree(base_page,dpth=0):
for child in base_page:
print " "*dpth, child.data
get_tree(child.children, dpth= dpth+1)
data = new_node.get_data()
for zz in data:
get_tree(zz.children)
如你所见,如果我使用延迟加载,上面的函数会发出很多查询。
答案 0 :(得分:0)
我认为你不能使用纯sqlalchemy
,因为MySql
不支持递归查询(或递归CTE
)。请参阅此答案Generating Depth based tree from Hierarchical Data in MySQL (no CTEs)
当然,您可以使用joinedload
和contains_eager
预加载一个或两个级别。
或者,您可以编写存储过程并使用from_statement
从SA调用它。