如何使用 sqlalchemy 对条目进行排名?

use*_*323 4 python sql sqlalchemy flask flask-sqlalchemy

我创建了一个模型用户,它具有列分数和排名。我想定期更新 User 中所有用户的排名,以便得分最高的用户排名 1,第二高的得分排名 2 等等。无论如何在 Flask-SQLAlchemy 中有效地实现这一点?

谢谢!

顺便说一句,这是模型:

app = Flask(__name__)
db = SQLAlchemy(app)        
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    score = db.Column(db.Integer)
    rank = db.Column(db.Integer)
Run Code Online (Sandbox Code Playgroud)

zzz*_*eek 5

至于为什么会这样做,这是为了您可以查询“排名”而无需执行聚合查询,这可以提高性能。特别是如果您想查看“用户#456 的排名是多少?” 没有击中每一行。

执行此操作的最有效方法是单个 UPDATE。使用标准 SQL,我们可以使用这样的相关子查询:

UPDATE user SET rank=(SELECT count(*) FROM user AS u1 WHERE u1.score > user.score) + 1
Run Code Online (Sandbox Code Playgroud)

一些数据库有像 PG 的 UPDATE..FROM 这样的扩展,我对它的经验较少,也许如果你可以 UPDATE..FROM 一个 SELECT 语句,它使用一个更有效的窗口函数立即获得排名,尽管我不是完全确定。

无论如何,我们使用 SQLAlchemy 的标准 SQL 看起来像:

from sqlalchemy.orm import aliased
from sqlalchemy import func
u1 = aliased(User)
subq = session.query(func.count(u1.id)).filter(u1.score > User.score).as_scalar()
session.query(User).update({"rank": subq + 1}, synchronize_session=False)
Run Code Online (Sandbox Code Playgroud)