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 之后......)。我希望有一天社区能帮助我更好地回答这个问题。