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)
至于为什么会这样做,这是为了您可以查询“排名”而无需执行聚合查询,这可以提高性能。特别是如果您想查看“用户#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)
| 归档时间: |
|
| 查看次数: |
2123 次 |
| 最近记录: |