如何使用SQLAlchemy更改LEFT JOIN子句中的表的顺序

时间:2016-09-11 04:27:24

标签: python sqlalchemy

我希望执行以下SQL:

SELECT c.name, count(1)
FROM post p LEFT JOIN category_post cp ON (p.id = cp.post_id)
     LEFT JOIN category c ON (cp.category_id = c.id)
WHERE 1=1 
    AND post.is_published = 1
GROUP BY c.name;

帖子包含0个或更多类别。这篇文章将返回每个类别的计数,包括未分类的帖子,因为我从post->类别开始LEFT JOIN,而不是相反,这不包括未分类的计数讯息。

在SQLAlchemy中,我可以使用以下内容获得解决方案的一部分,但它不会返回未分类帖子的数量,因为LEFT JOIN的方向错误:

from sqlalchemy.sql import func
q = session.query(Category.name, func.count(1)) \
        .outerjoin(CategoryPost) \
        .outerjoin(Post) \
        .filter(Post.is_published == True) \
        .group_by(Category.name)

由此生成的SQL是:

SELECT category.name AS category_name, count(1) AS count_1 
FROM category LEFT OUTER JOIN category_post ON category.id = category_post.category_id 
     LEFT OUTER JOIN post ON post.id = category_post.post_id 
WHERE post.is_published = 1 
GROUP BY category.name

如果我能以某种方式改变JOIN子句中表格的顺序,或者甚至只是在保持相同顺序的情况下进行正确的加入,我就可以实现我的目标。

1 个答案:

答案 0 :(得分:1)

使用select_from()

session.query(Category.name, func.count(1)) \
       .select_from(Post) \
       .outerjoin(CategoryPost) \
       .outerjoin(Category) \
       ...