对于嵌套评论系统,我使用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;
应该如何使用 SQLAlchemy 来生成这个 SQL?
我已经成功了,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);
那可能吗?