渴望加载邻接列表关系

时间:2014-01-01 20:15:40

标签: python mysql sql sqlalchemy flask-sqlalchemy

我有下面的数据库架构

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)

如你所见,如果我使用延迟加载,上面的函数会发出很多查询。

1 个答案:

答案 0 :(得分:0)

我认为你不能使用纯sqlalchemy,因为MySql不支持递归查询(或递归CTE)。请参阅此答案Generating Depth based tree from Hierarchical Data in MySQL (no CTEs) 当然,您可以使用joinedloadcontains_eager预加载一个或两个级别。

或者,您可以编写存储过程并使用from_statement从SA调用它。