让我们说有一张桌子"帖子"其中包含博客文章和另一个表格#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中完成此操作?
答案 0 :(得分:3)
实际上你只需要用outerjoin
替换join
,过滤器就可以了。
此外,如果您的favorites
表中不包含其他信息且仅包含users
和posts
链接,则应考虑简单地定义`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)