SQLAlchemy order_by 具有 int 值的字符串列
SQLAlchemy order_by string column with int values
我有一个带有字符串列的 table,但它只包含整数(作为字符串)。
当我想 order_by 某些查询中的此列时,问题就来了。 SQLAlchemy(或更具体地说 python)对字符串使用字典顺序,因此
>>> '100000' < '99999'
True
即使
>>> 100000 < 99999
False
我怎样才能达到 order_by 这个字符串列的数值?
我目前有这样的查询:
session.query(TableName).filter(TableName.column == 'some_value').order_by(TableName.string_column_holding_integers).all()
请注意,将列的类型更改为整数不是一个选项,我需要在当前条件下正确地 order_by(按数值)。
还刚刚发现直接在数据库上使用 SQL(这个是 MySQL 数据库)我无法按此列正确排序,所以我发现使用 CAST(string_column_holding_integers AS unsigned) 在这里工作。但是还没有找到直接在 SQLAlchemy 查询上执行此操作(CAST 部分)的方法。
您可以像这样在 SQLAlchemy 中执行 cast
:
session.query(...).filter(...).order_by(cast(TableName.string_column_holding_integers, Integer))
对于字母数字,我能想到的最佳方法是:
from sqlalchemy import DECIMAL, cast, func
session.query(...).filter(...).order_by(
func.ascii(TableName.column_name).asc(),
cast(
func.nullif(func.regexp_replace(TableName.column_name, "\D", "", "g"), ""),
DECIMAL,
).asc(),
)
排序如下:
-----+-------------
1
100
2
20
A1
A2
B1
不完美(理想情况下,100 会在 20 之后......)。我希望有一天社区能帮助我更好地回答这个问题。
我有一个带有字符串列的 table,但它只包含整数(作为字符串)。
当我想 order_by 某些查询中的此列时,问题就来了。 SQLAlchemy(或更具体地说 python)对字符串使用字典顺序,因此
>>> '100000' < '99999'
True
即使
>>> 100000 < 99999
False
我怎样才能达到 order_by 这个字符串列的数值?
我目前有这样的查询:
session.query(TableName).filter(TableName.column == 'some_value').order_by(TableName.string_column_holding_integers).all()
请注意,将列的类型更改为整数不是一个选项,我需要在当前条件下正确地 order_by(按数值)。
还刚刚发现直接在数据库上使用 SQL(这个是 MySQL 数据库)我无法按此列正确排序,所以我发现使用 CAST(string_column_holding_integers AS unsigned) 在这里工作。但是还没有找到直接在 SQLAlchemy 查询上执行此操作(CAST 部分)的方法。
您可以像这样在 SQLAlchemy 中执行 cast
:
session.query(...).filter(...).order_by(cast(TableName.string_column_holding_integers, Integer))
对于字母数字,我能想到的最佳方法是:
from sqlalchemy import DECIMAL, cast, func
session.query(...).filter(...).order_by(
func.ascii(TableName.column_name).asc(),
cast(
func.nullif(func.regexp_replace(TableName.column_name, "\D", "", "g"), ""),
DECIMAL,
).asc(),
)
排序如下:
-----+-------------
1
100
2
20
A1
A2
B1
不完美(理想情况下,100 会在 20 之后......)。我希望有一天社区能帮助我更好地回答这个问题。