4

このテーブルスキーマでは:

class Location(db.Model):
    id = db.Column(db.String(255), primary_key=True)
    parent_id = db.Column(db.String(255), db.ForeignKey('location.id'), nullable=True) 
    type = db.Column(db.String(255))
    name = db.Column(db.String(255))
    options = db.Column(db.Text, nullable=True)

私には親がいます。次のテーブルがあるとします。

> select * from location;
+--------------------------------------+--------------------------------------+---------+-----------+---------+
| id                                   | parent_id                            | type    | name      | options |
+--------------------------------------+--------------------------------------+---------+-----------+---------+
| 8821da60-e7d2-11e1-951e-ae16bc2b7368 | 88227a60-e7d2-11e1-951e-ae16bc2b7368 | city    | sengkang  | NULL    |
| 88227a60-e7d2-11e1-951e-ae16bc2b7368 | NULL                                 | country | singapore | NULL    |
+--------------------------------------+--------------------------------------+---------+-----------+---------+

親はシンガポールという名前のカントリーオブジェクトです。センカンがシンガポールの子であるのと同じように、センカン子であるネストされたオブジェクトがさらに存在する可能性があります。

したがって、単一の階層チェーンは、a-> b->sengkang->singaporeのようになります。

それによって->はの子であることを意味します

親オブジェクト(シンガポール)を含む、親がシンガポールであるすべてのLocationオブジェクトを取得するにはどうすればよいですか?(SQLAlchemyでお願いします)。ありがとう!

4

1 に答える 1

6

SAドキュメント:Query.cte

新しいCTEのもの(0.76以降)はかなり良いと言わざるを得ません。これは、これをやり直さなければならなかった古い方法よりも優れています。

とにかく、あなたはこのようなものを探していると思います...

included_parts = session.query(Location).\
  filter(Location.name=='singapore').\
  cte(name='included_parts', recursive=True)

incl_alias = aliased(included_parts, name="pr")
parts_alias = aliased(Location, name='p')
included_parts = included_parts.union_all(
  session.query(parts_alias).filter(parts_alias.parent_id==incl_alias.c.id)
)

q = session.query(included_parts).all()
于 2012-08-17T00:16:37.843 に答える