【发布时间】:2013-01-14 13:14:50
【问题描述】:
对于嵌套评论系统,我使用Comment 模型中的以下定义将树结构存储在 PostgreSQL 表中:
path = sa.Column(ARRAY(sa.Integer))
这会将所有 cmets 的 ID 存储在当前路径的路径中。因此,如果 id 为 15 的评论是 11 和 13 的子项,则其路径将为 [11,13,15]。
现在我想找到并计算子 cmets。因此,为了找到评论 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);
这可能吗?
【问题讨论】:
-
您收到 SyntaxError 'keyword can't be an expression' 因为您使用了单个等号 = 而不是 ==
-
@slashdottir 谢谢 - 它总是那些愚蠢的小事。
标签: python postgresql sqlalchemy