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

Python 如何使用sqlalchemy对条目进行排名?,python,sql,sqlalchemy,flask,flask-sqlalchemy,Python,Sql,Sqlalchemy,Flask,Flask Sqlalchemy,我已经创建了一个模型用户,它具有score和rank列。我想定期更新用户中所有用户的排名,以便得分最高的用户排名1,得分第二的用户排名2,等等。在炼金术中是否有有效的方法来实现这一点 谢谢 顺便说一句,以下是模型: app = Flask(__name__) db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) score = db.Colum

我已经创建了一个模型用户,它具有score和rank列。我想定期更新用户中所有用户的排名,以便得分最高的用户排名1,得分第二的用户排名2,等等。在炼金术中是否有有效的方法来实现这一点

谢谢

顺便说一句,以下是模型:

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)

只需在所有用户上循环:

users = User.query.order_by(User.score._desc()).all() #fetch them all in one query
for (rank, user) in enumerate(users):
    user.rank = rank + 1 #plus 1 cause enumerate starts from zero

db.session.commit()

至于为什么要这样做,这样您就可以查询排名,而无需执行聚合查询,这样性能会更好。特别是如果你想知道456用户的排名是多少?没有击中每一排

最有效的方法是一次更新。使用标准SQL,我们可以使用如下相关子查询:

UPDATE user SET rank=(SELECT count(*) FROM user AS u1 WHERE u1.score > user.score) + 1
有些数据库有一些扩展,比如PG的UPDATE..FROM,我对它没有太多经验,如果你能用一个SELECT语句来更新..它可以使用一个窗口函数立即获得排名,这样效率会更高,尽管我不能完全确定

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

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)

如果大多数RDBMS上的SQL查询本身可以获得所有用户的排名,那么为什么需要将其存储在数据库中呢。您使用哪个数据库后端?正如@zzzeek所提到的,如果后端支持UPDATE..FROM和window功能,可能会有更有效的方法。在PostgreSQL情况下,您可以使用行号检查此:。无效。一个有数千用户的表呢?@SBillion可能无法处理大型数据集,但说“无用”是错误的。我的答案是纯粹的sqlalchemy,因为OP没有指定他使用的是哪种rdbms。因此,我们不能假设有子查询的支持,就像上面伟大的zzzeek答案一样。在现代,您甚至可以使用多处理或任务队列跨工作人员分发这样的任务,而无需在一次简单的更新中阻塞数据库。