2014-01-16 6 views
0

У меня есть таблица с столбцом целых чисел, которые представляют type строки. Эти целые числа варьируются от 1 до 5. Как указать пользовательский порядок сортировки в SQLAlchemy, например, если я хочу отсортировать строки в следующем порядке: [4, 2, 3, 5, 1]?SQLALchemy custom integer порядок сортировки

Я знаю тип данных Enum, но это сопоставление с VARCHAR в бэкэнде базы данных и изменение схемы не является вариантом.

ответ

4

Мое предположение, что у вас уже есть таблица, которая содержит некоторую информацию о type или строке. И если вы этого не сделаете, возможно, у вас должна быть такая таблица поиска. Если это упорядочение всегда одно и то же, я бы добавил столбец в эту таблицу, чтобы указать порядок, присоединиться к нему и использовать его.

class TypeInfo(Base): 
    __tablename__ = 'typeinfo' 
    id = Column(Integer, primary_key=True) 
    sort_order = Column(Integer) 

# assiming the database contains values like: 
tis = [ TypeInfo(id=1, sort_order=50), 
     TypeInfo(id=2, sort_order=20), 
     TypeInfo(id=3, sort_order=30), 
     TypeInfo(id=4, sort_order=10), 
     TypeInfo(id=5, sort_order=40), 
     ] 

# your query might look like below: 
q = session.query(SomeTable) 
q = q.join(TypeInfo, SomeTable.type == TypeInfo.id).order_by(TypeInfo.sort_order) 

В случае, когда вы не можете изменить базу данных, или заказ может отличаться, вы можете решить эту проблему с выражением case, хотя это не может быть быстрым исполнителем на больших наборах данных:

_whens = {4: 1, 2: 2, 3: 3, 5: 4, 1: 5} 
sort_order = case(value=SomeTable.type, whens=_whens) 
q = session.query(SomeTable) 
q = q.order_by(sort_order) 
+0

Это интересный подход, и хотя я не прочь создать таблицу, содержащую порядок сортировки, который кажется мне немного переполненным. Я лично не сделал бы этого в SQL. Базы данных предоставляют вам опрятный [синтаксис] (http://stackoverflow.com/a/4088921/463782), например 'ORDER BY idx (массив [4, 2, 3, 5, 1], s.type)'. Дело намного ближе к тому, что я имел в виду, но я буду следить за выступлением. – CadentOrange

+1

После некоторого тестирования выражение 'case' работает хорошо, и я не замечаю никаких провалов производительности. Спасибо за ответ. – CadentOrange

Смежные вопросы