ネストされたコメント システムの場合、Comment
モデルで次の定義を使用して、ツリー構造を PostgreSQL テーブルに格納しています。
path = sa.Column(ARRAY(sa.Integer))
これにより、コメントのすべての ID が現在のパスに保存されます。したがって、id
15 のコメントが 11 と 13 の子である場合、そのパスは になります[11,13,15]
。
ここで、子コメントを見つけて数えたいと思います。したがって、コメント 11 のすべての子を見つけるために、それ自体を含めて、次のような SQL を生成したいと考えています。
SELECT id, path FROM comments WHERE path[1] = 11;
私のデータベースでは、これはコメント 11 とその子の素敵なセットを喜んで返します。
上記の例で、コメントの子を取得したい場合は、次の SQL を使用できます。
SELECT id, path FROM comments WHERE path[1] = 11 AND path[2] = 13;
この SQL を生成するには、SQLAlchemy をどのように使用すればよいですか?
filter_by()
私は多くの成功を収めて、または成功せfilter()
ずにハッキングしました...これらのどちらも機能しません:
q = Comment.query.filter(path[1] == 11)
> NameError: name 'path' is not defined
q = Comment.query.filter_by(path[1] = 11)
> SyntaxError: keyword can't be an expression
このクエリ用にカスタム SQL を記述したくないのですが、それが唯一の方法である場合は、どのように構築するのが最適かについての指針を教えてください。
編集 1
SQLAlchemy 0.7 を使用していることを確認するため、このバージョンで (回避して) 動作する回答は非常に役立ちます。
上記のコメントの実装では、ID 番号を正確な位置で見つける必要はなく、任意の位置で見つけることもできることに気付きました。したがって、SQLAlchemy を作成してこのようなものを生成する方法についての入力は良いでしょう:
SELECT id, path FROM comments WHERE 11 = ANY (path);
それは可能ですか?