SQLAlchemy order_by 根据第一个数字而不是整个数字返回数字

问题描述 投票:0回答:1

我正在使用 Python 和 SQLAlchemy 构建一个 Web 应用程序。

我使用以下代码来检索记录。

yardDB.query.order_by(yardDB.PIT.asc())

它根据我的“PIT”列中的升序返回记录,但它没有按照我需要的方式返回记录。 (下图中绿色高亮部分)

*注意,Seq 列与绿色列不同。绿色列也被隐藏,但我取消隐藏它以查看它如何返回记录。

Picture of how it's returning records

我需要它简单地返回行,例如 1, 2, 3, .... 10, 11, ... 20, 21, ...

编辑:列出我尝试过但没有成功的事情。

  • 将我的 PIT 列数据类型更改为整数和字符串
  • 添加了前导 00
  • 取消了所进行查询的升序。

yardDB.query.order_by(yardDB.PIT)

python sqlalchemy sql-order-by
1个回答
0
投票

这可能会迟到,但我刚刚为自己解决了同样的问题。其他评论也建议我对字符串列进行排序,但我是对 id 进行排序,这绝对不是字符串列。

还可以通过在控制台中输入“User.id.type”进行确认,该控制台返回“Integer()”

SQLAlchemy 通过其文档的默认排序是:

q = session.query(Entity).order_by(Entity.id)

我们需要做的是将响应转换为十进制

import sqlalchemy as sqla

formated_column = sqla.cast(sqla.func.substring(Entity.id, "([0-9]+)"), sqla.DECIMAL)
q = session.query(Entity).order_by(formated_column)

现在返回排序结果

  • 来自:1, 10, 11, 100, 101, 2, 21, 22, 23...
  • 至:1, 2, 10, 11, 21, 22, 23, 100, 101

附注如果您担心 CAST 函数的性能,它应该优于任何其他服务器函数

© www.soinside.com 2019 - 2024. All rights reserved.