SQLAlchemy order_by字符串列,其int值为

时间:2016-04-05 02:28:05

标签: python mysql sqlalchemy lexicographic

我有一个带有String列的表,但它只包含整数(作为字符串)。

如果我想在特定查询的此列上订购,则会出现问题。 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部分)的方法。

2 个答案:

答案 0 :(得分:4)

您可以在SQLAlchemy中执行cast,如下所示:

session.query(...).filter(...).order_by(cast(TableName.string_column_holding_integers, Integer))

答案 1 :(得分:0)

对于字母数字,我能想到的最好方法是:

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  

并不完美(理想情况下,20之后为100 ...)。我希望有一天社区能够帮助我更好地回答这个问题。