首页 > 解决方案 > SQLAlchemy 按值排序时获得位置?

问题描述

我有一个存储一些电影信息和分数的表。

我希望能够知道一部电影在按该分数排序后的位置(即“闪灵”的分数排在第 10 位),但它显然不一定在数据库的第十位或 id 为 10。

是否有可能通过查询或以某种方式将其保留为表中的值来获得类似的东西?

谢谢!

该表如下所示:

class MoviePersonScores(db.Model):
    movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'), primary_key=True)
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'), primary_key=True)
    score = db.Column(db.Integer)
    person = relationship("Person", back_populates="movies")
    movie = relationship("Movie", back_populates="people")

标签: pythonsqlalchemy

解决方案


此查询可以分为两个不同的步骤:

  1. 获取表中每条记录的排名
  2. 获取特定记录的排名

因为rank是相对于整个表集合的,所以您别无选择,只能计算每条记录的排名。但是, 的魔力sqlalchemy允许您利用数据库来执行这些计算。

其次,您的应用程序不需要每个对象的等级。因此,我们将链接查询以仅提供我们想要的查询。

sqlalchemy神奇的是,我们可以链接这些查询以在单个数据库事务中执行:

from sqlalchemy import func

# Assuming you have a session established somewhere
# though `MoviePersonScores.query` may work just the same

query = session.query(
    MoviePersonScores, 
    func.rank()\
        .over(
            order_by=MoviePersonScores.score
        )\
        .label('rank')
    )

# now filter
query = query.filter_by(movie_id=movie_id)

# now execute:
my_movie = query.all()

# Or, just get the first value
my_movie = query.first()

推荐阅读