Python 使用子查询的SQLAlchemy左连接

Python 使用子查询的SQLAlchemy左连接,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,假设有一个表“posts”包含博客帖子,另一个表“favorites”将用户名链接到帖子。许多用户可以收藏一篇文章,因此这种关系是一篇文章对多个收藏夹的关系 我试图找出将帖子连接到收藏夹的语法,但我只想要那些用户是当前用户的收藏夹 我想要像这样的东西: current_user = 'testuser' posts.query.outerjoin(favorites, and_(posts.post_id == favorites.post_id, favorites.username == c

假设有一个表“posts”包含博客帖子,另一个表“favorites”将用户名链接到帖子。许多用户可以收藏一篇文章,因此这种关系是一篇文章对多个收藏夹的关系

我试图找出将帖子连接到收藏夹的语法,但我只想要那些用户是当前用户的收藏夹

我想要像这样的东西:

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中如何实现这一点?

实际上,您只需将
外部连接
替换为
连接
,过滤器就可以正常工作了

此外,如果您的<代码>收藏夹< /代码>表不包含附加信息,并且仅链接“代码>用户< /COD>和<代码> POST ,您应该考虑简单地定义A。在文档示例中,父/子将是您的用户/帖子

Update-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)

favorites表还包含分数-例如用户对文章的喜爱程度为1-5。而且,当我使用join时,只会出现受欢迎的帖子。相反,我希望所有的帖子都能被退回,但我只想要那些属于当前用户的收藏夹。i、 e.如果当前用户不喜欢某篇文章,那么它应该仍然会出现,但没有列出喜欢的对象。如果当前用户和其他几个用户喜欢该帖子,则只应显示当前用户的收藏夹。