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

2024-01-26

我创建了一个模型用户,其中包含分数和排名列。我想定期更新 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(使用前将#替换为@)

如何使用 sqlalchemy 对条目进行排名? 的相关文章

随机推荐

  • 如何让 Jenkins 在检查更改时忽略某些文件?

    在CVS配置的 排除区域 中 我添加了以下内容 d o so a exe obj dll lib txt tar tar gz 所有具有上述扩展名的文件都应被忽略 然而 Jenkins 仍然基于某个文件夹 ABC 中的文件 build tx
  • 提取“$@”中最后一个参数之前的参数

    我正在尝试创建一个 Bash 脚本 它将将从命令行给出的最后一个参数提取到一个变量中以在其他地方使用 这是我正在编写的脚本 bin bash compact archive and compact file folder s eval LA
  • 删除 NSTokenFieldCell 的回调

    我有一个 NSTokenField 和 NSTokenFieldCell 代表托管对象 当我通过键入创建一个新的 NSTokenFieldCell 时 我的 NSTokenField 的委托 NSArrayController 将使用以下方
  • 使用 mysqldump 忽略 mysql 数据库备份中的“视图”

    我需要忽略数据库中的所有视图并使用 mysqldump 进行备份 目前我正在使用以下选项 ignore table view1 ignore table view2 ignore table view3 有没有什么方法可以在不指定所有 视图
  • Spring boot项目中定义的全局变量和应用程序变量

    我正在尝试使用 spring 和 spring boot 开发微服务 在我的项目中 我正在将整体架构转换为面向服务的架构 项目包含 20 个微服务 我需要设置应用程序变量和全局变量 我有与此相关的困惑 我在这里添加这些困惑 可以在 appl
  • reST:具有任意标题的内联链接?

    如果我定义了内部超链接目标 如何使用任意文本作为链接标题链接到它 例如 This is a very long internal link target A short reference to the very long link tar
  • Web API 帮助页面 - 用户特定的响应类型

    我正在开发一个 API 它根据用户输出不同的响应 并且我当前正在使用 ResponseType 属性来描述返回的响应类型 但这仅允许我指定一种类型的响应 该响应类型在用户 有什么方法可以自定义帮助页面以显示用户将获得的响应类型吗 HelpP
  • HTML 语法高亮 sublime 3 Typescript

    我正在使用 TypeScript 和 Sublime 3 如何在模板属性中添加 HTML 高亮显示 注意 我已经在使用 Microsoft TypeScript 包 看看现在它没有突出显示 这是一个快速修复 仍然可以使用您已安装的TypeS
  • 如何使用 facebook sdk 在 LoginButton 中设置权限“publish_actions”?

    我想在 Facebook 时间线上发布一张照片 我正在使用 LoginButton 来设置权限 publish actions 但是我收到错误消息 com facebook FacebookException Cannot pass a p
  • 在 Javascript onClick 事件中传递参数

    我试图在 onclick 事件中传递一个参数 下面是示例代码 div div
  • Android TTS onUtteranceCompleted 回调未被调用

    我试图让 Android TTS API 读取我的 话语 然后调用 onUtteranceCompleted 监听器 但未成功 我已经注册了我的 TTS 对象 并且它返回 SUCCESS 所以我一生都无法弄清楚为什么我的回调没有被调用 我尝
  • HikariCP 1.4.0 MBean InstanceNotFoundException

    我的数据库连接池使用以下配置 使用HikariCP 1 4 0 jdk1 6 0 45和Oracle Express 11g 在Windows 7上运行 HikariConfig config new HikariConfig config
  • HAProxy - 配置 HTTP 前端以侦听多个端口

    我的 HAProxy 配置中有一个 HAProxy HTTP 前端 如下所示 frontend myaddress net 10098 bind 80 8080 mode http log global option http server
  • 月份不是从日期打印出来的 - Java DateFormat

    如何从java中的日期获取月份 DateFormat inputDF new SimpleDateFormat mm dd yy Date date1 inputDF parse 9 30 11 Calendar cal Calendar
  • React 18严格模式导致组件渲染两次[重复]

    这个问题在这里已经有答案了 对严格模式的更改反应版本 18导致我的代码渲染两次 这会导致错误axios中止控制器 但我不知道如何清除error应用程序渲染两次后从浏览器控制台 请注意 我正在开发一个注册 登录应用程序 即使在我成功登录后 R
  • 如何在 jQuery 中调用 C# 方法?

    我正在使用一个图表 它应该从 C 获取输入来绘制图表 我使用 JSON 将值从 C 返回到 jQuery 无论如何 这对我没有帮助 我做错了什么 这是我的 aspx 代码
  • 如何使用 navigator.pop 返回 bool 值?

    我试图从对话框返回一个布尔值 但我不明白为什么该值没有根据需要返回 我尝试返回作为未来值 并在弹出对话框后将值与上下文一起返回 final bool delete await showDialog print delete Future
  • cordova - 如何将 CCAvenue 集成到 Ionic2

    我是 IONIC2 和 Angular2 的新手 在我的应用程序中 我需要带有商家服务器的 CCavenue 支付网关 请给我解决该问题的步骤 首先 您需要建立一个 CCAvenue 帐户 转到 注册 页面 选择 Startup Pro 计
  • 如何在 Docker 容器中挂载主机目录

    我正在尝试将主机目录挂载到 Docker 容器中 以便在主机上完成的任何更新都会反映到 Docker 容器中 我哪里做错了 这是我所做的 kishore cat Dockerfile FROM ubuntu trusty RUN apt g
  • 如何使用 sqlalchemy 对条目进行排名?

    我创建了一个模型用户 其中包含分数和排名列 我想定期更新 User 中所有用户的排名 使得得分最高的用户排名 1 第二高得分排名 2 等等 有没有办法在 Flask SQLAlchemy 中有效地实现这一点 Thanks 顺便说一句 这是模