2016-04-05 3 views
0

У меня есть таблица со столбцом String, но она содержит только целые числа (в виде строк).SQLAlchemy order_by строковый столбец со значениями int

Проблема возникает, когда я хочу заказать этот столбец по определенному запросу. SQLAlchemy (или питон более конкретно) использует лексикографический порядок строк, так

>>> '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 без знака). Но не нашли способ сделать это (часть CAST) непосредственно по запросам SQLAlchemy.

ответ

1

Вы можете сделать cast в SQLAlchemy, как это:

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

что, если столбец содержит оба числа & строк? как я могу сохранить правильный порядок? –

+0

@ Ricky Это невозможно. Все значения в столбце должны быть одного типа. – univerio

+0

В PostgressSQL вы можете: ORDER BY NULLIF (regexp_replace (my_column_1, E '\\ D', '', 'g'), '') :: int (если значение не INT - оно игнорируется и продолжается) таким образом, мы можем корректно упорядочить числовые значения и продолжить с помощью строк, как обычно, que is - как в SQLAlchemy мы делаем это –