我创建了一个模型用户,其中包含分数和排名列。我想定期更新 User 中所有用户的排名,使得得分最高的用户排名 1,第二高得分排名 2,等等。有没有办法在 Flask-SQLAlchemy 中有效地实现这一点?
Thanks!
顺便说一句,这是模型:
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)
至于为什么要这样做,是为了让您可以查询“排名”而无需执行聚合查询,这样可以提高性能。特别是如果您想查看“用户 #456 的排名是什么?”无需击中每一行。
最有效的方法是一次更新。使用标准 SQL,我们可以使用如下的相关子查询:
UPDATE user SET rank=(SELECT count(*) FROM user AS u1 WHERE u1.score > user.score) + 1
有些数据库有像 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)