【问题标题】:Eager Loading Adjacency List Relationship急切加载邻接表关系
【发布时间】:2014-01-19 07:14:27
【问题描述】:

我有下面的数据库架构

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)

如您所见,如果我使用延迟加载,上述函数会发出大量查询。

【问题讨论】:

  • 我认为你不能使用纯粹的sqlalchemy,因为MySql 不支持递归查询(或递归CTE)。当然,您可以使用joinedloadcontains_eager 预加载一个或两个级别

标签: python mysql sql sqlalchemy flask-sqlalchemy


【解决方案1】:

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

不过,您也可以编写一个存储过程并使用 from_statement 从 SA 中调用它。

【讨论】:

  • 值得注意的是,MySQL 8 终于支持 CTE。
猜你喜欢
  • 2021-04-28
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多