小能豆

SQLAlchemy 按值排序时获取位置?

py

我有一张表,其中存储了一些电影信息和分数。

我想要知道一部电影按分数排序后的排名(例如《闪灵》得分排名第 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")

阅读 22

收藏
2024-12-31

共1个答案

小能豆

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

  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()
2024-12-31