1

データベースからの階層データの表示に関する次のチュートリアルに従っていますhttp://docs.sqlalchemy.org/en/rel_0_7/orm/relationships.html#adjacency-list-relationships

これまでのところ、次の表があります

class Node(Base):
    __tablename__ = 'node'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('node.id'))
    data = Column(String(50))
    parent = relationship("Node", remote_side=[id])

そしてmysqlの次のエントリ

id  parent_id   data
1   NULL            root
2   1 [->]          child1
3   1 [->]          child2
4   3 [->]          subchild1
5   3 [->]          subchild 2
6   1 [->]          child3
7   NULL            root2
8   NULL            root3
9   7 [->]          subchild0froot2
10  8 [->]          subchildofroot3
11  1 [->]          child4

root -> child1 -> child2 ->(subchild1->subchild2)->child4 など、コメントに適した形式でデータを取得したい

これまでのところ、このクエリを使用して親の子を取得できました

nodealias = aliased(Node)
qry = session.query(nodealias,Node).\
                join(nodealias, Node.parent).\
                filter(and_(Node.postid==45))



print qry
for x,y in qry:
    print x.data
    print y.data

    print "...."

And it displays

root
child1
....
root
child2
....
child2
subchild1
....
child2
subchild 2
....
root
child3
....
root
child4
....

この結果を次のようにグループ化したい

root
....
child1
....
child2
subchild1
subchild 2
....
child3
....
child4
....
4

1 に答える 1

0

彼の子なしでルートを取得するには、INNER JOIN の代わりに OUTER JOIN を使用する必要があります。

子を親でグループ化するには、GROUP BY を使用する必要があります。

したがって、クエリは次のようになります。

  qry = session.query(nodealias,Node).\
        outerjoin(nodealias, Node.parent).\
        group_by(Node.parent).all()

次に、最初のレベルの葉の間にセパレーターを配置するには、結果を反復するときにparent.idでテストを行う必要があります。結果セットにルートが含まれているため、NoneType 親を確認することを忘れないでください。

  for parent, child in qry:
    if parent is None or parent.id != 1:
      print child.data
    else:
      print '...'
      print child.data

第 3 レベルの葉でより適切に表現するには、parent.id != 2 をチェックして同様の手法を適用できます。

これがあなたを助けることを願っています。

于 2012-10-18T17:09:40.297 に答える