SQLAlchemy order_by具有int值的字符串列

Jav*_* C. 3 python mysql sqlalchemy lexicographic

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

问题是当我想在某些查询上对这一列进行order_by时。SQLAlchemy(或更具体地说,是python)对字符串使用字典顺序,因此

>>> '100000' < '99999'
True
Run Code Online (Sandbox Code Playgroud)

即使在

>>> 100000 < 99999
False
Run Code Online (Sandbox Code Playgroud)

如何通过此字符串列的数值实现order_by?

我目前有这样的查询:

session.query(TableName).filter(TableName.column == 'some_value').order_by(TableName.string_column_holding_integers).all()
Run Code Online (Sandbox Code Playgroud)

请注意,将列的类型更改为整数不是一种选择,我需要在当前条件下正确地按数字排序(按数值)。

也只是发现直接在使用SQL的数据库(此数据库是MySQL数据库)上无法正确地按此列排序,因此我发现使用CAST(未签名的string_column_holding_integers AS)可以在此工作。但是还没有找到一种直接对SQLAlchemy查询执行此操作的方法(CAST部分)。

uni*_*rio 5

您可以cast在SQLAlchemy中执行以下操作:

session.query(...).filter(...).order_by(cast(TableName.string_column_holding_integers, Integer))
Run Code Online (Sandbox Code Playgroud)

  • @Ricky 正如您所说,这不是混合类型的列,但是您可以按相同的方式订购。如果你想使用`text`,你甚至可以使用那个确切的字符串。尝试`.order_by(cast(func.nullif(func.regexp_replace(tbl.c.my_column_1, "\\D", "", "g"), ""), Integer))`。 (2认同)