SQLAlchemy查询,基于关系连接并按计数排序

12

我有两个如下所示的SQLAlchemy模型:

##############
# Post Model #
##############
class Post(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(250))
    content = db.Column(db.String(5000))
    timestamp = db.Column(db.Integer)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    likes = db.relationship('Like', backref = 'post', lazy = 'dynamic')

###############
# Likes Model #
###############
class Like(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    voter_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'))

你可以看到,有一个帖子模型和一个用户对这些帖子点赞的模型。我想创建一个查询来选择所有帖子,并按该帖子具有的点赞数量排序。在 shell 中,我可以运行:

SELECT post.*, 
       count(like.id) AS num_likes
FROM post
LEFT JOIN like
ON post.id = like.post_id
GROUP BY post.id;

SQLAlchemy 命令的等价语句是什么?

谢谢!


1
SQLAlchemy在使用ORM编写查询方面有非常好的文档,包括关于使用JOIN查询的部分。您还可以查看查询对象API,以了解它具有group_by()方法。在使用SQLAlchemy创建此查询时,您是否遇到了任何特定的问题? - Mark Hildreth
1个回答

12

从原始查询到Flask-SQLAlchemy的转换基本上是机械的:

db.session.query(Post, db.func.count(Like.id)).outerjoin(Like).group_by(Post.id)

4
谢谢,这正是我在寻找的!我稍微修改了一下,这样我就能使用Flask-SQLAlchemy BaseQuery paginate()方法:```Post.query.outerjoin(Like).group_by(Post.id).order_by(db.func.count(Like.id).desc(), Post.timestamp.desc()).paginate(page_num, 10, False)```但基本上还是一样的。再次感谢! - sundance
不,这很令人困惑。 - Benjamin Crouzier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接