【发布时间】: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)。当然,您可以使用joinedload和contains_eager预加载一个或两个级别
标签: python mysql sql sqlalchemy flask-sqlalchemy