SQLAlchemy使用子查询离开了联接

时间:2014-12-10 03:03:26

标签: python sqlalchemy flask-sqlalchemy

让我们说有一张桌子"帖子"其中包含博客文章和另一个表格#34;收藏夹"将用户名链接到帖子。许多用户可以收藏一个帖子,所以关系是一个帖子到很多收藏夹。

我正在试图找出将帖子加入收藏夹的语法,但我只想要那些用户是当前用户的收藏夹。

我想要一些像:

current_user = 'testuser'
posts.query.outerjoin(favorites, and_(posts.post_id == favorites.post_id, favorites.username == current_user)).limit(10).all()

这让我非常接近,除了它似乎" favorites.username == current_user"条件基本上被忽略了。这是我在实际SQL中寻找的东西:

SELECT *
FROM posts p
LEFT JOIN (
            SELECT * FROM favorites f WHERE f.user_id = 'testuser'
          ) ff ON ff.post_id = p.post_id
LIMIT 10

值得一提的是,我已在帖子中定义了关系:

favorites = db.relationship("favorites")

我已经在这样的收藏夹中定义了外键:

post_id = db.Column(db.String(255), db.ForeignKey('posts.post_id'))

如何在SQLAlchemy中完成此操作?

1 个答案:

答案 0 :(得分:3)

实际上你只需要用outerjoin替换join,过滤器就可以了。

此外,如果您的favorites表中不包含其他信息且仅包含usersposts链接,则应考虑简单地定义`Many to Many' relationship。在文档示例中,父/子将是您的用户/帖子。

更新-1:只是回答问题的第二部分给出您的评论,下面的查询应该会给您一个想法:

current_user = 2
subq = (db.session.query(favorites)
        .filter(favorites.user_id == current_user).subquery('ff'))
q = (db.session.query(posts, subq.c.score)
     .outerjoin(subq, subq.c.post_id == posts.post_id))
q = q.order_by(subq.c.score.desc())
for post, score in q:
    print(post, score)