2014-05-12 3 views
3

я модель, которая использует тип Enum поля:Укажите порядка сортировки для поля типа Enum

from sqlalchemy import Column, Enum, Integer, String 

class Task(Base): 
    __tablename__ = 'tasks' 

    id = Column(Integer, primary_key=True) 
    summary = Column(String) 
    priority = Column(Enum('low', 'medium', 'high')) 

Если я сортировать записи по приоритету (перечисление), это сортирует по алфавиту:

high 
low 
medium 

Как я могу указать порядок сортировки для этого поля?

+0

Какую базу данных вы используете под обложками? –

+0

postgres, но предпочтительным является агностическое решение базы данных. – Jon

ответ

1

Другой способ может существовать, но самое простое (и большинство агрегированных баз данных) решение, которое я знаю, было бы использовать case statement в предложении order by.

Первый, настроить whens Dict для сазе, получая кортеж вы использовали для создания столбца Enum:

enums = Task.priority.type.enums # finds the Enum tuple (with the same order you originally gave it) 
whens = {priority: index for index, priority in enumerate(enums)} # dynamically creates whens dict based on the order of the Enum tuple 

Или, если необходимо, жесткий код вашего whens Dict (определенно меньше чем идеал, так как теперь вы должны изменить код в двух местах):

whens = {'low': 0, 'medium': 1, 'high': 2} 

Второй, настроить SOR т логик в случае утверждения:

sort_logic = case(value=Task.priority, whens=whens).label("priority") 

Третьего, запустить запрос и заказ по вашему сазу:

q = session.query(Task).order_by(sort_logic) # see the sql at the end of this answer 

Вы теперь запрос отсортированы по исходному Enum кортежу:

>>> for item in q: 
     print item.id, item.priority 
# now in the order you were looking for 
4 low 
7 low 
3 medium 
8 medium 
2 high 
6 high 

Для справки, приведенный выше запрос производит следующий SQL:

SELECT  tasks.id AS tasks_id, 
       tasks.summary AS tasks_summary, 
       tasks.priority AS tasks_priority 
FROM   tasks 
ORDER BY CASE tasks.priority 
      WHEN :param_1 THEN :param_2 
      WHEN :param_3 THEN :param_4 
      WHEN :param_5 THEN :param_6 
     END 
+0

Пятно на. Спасибо! Вот ссылка на документацию sqlalchemy для упомянутого case case (http://docs.sqlalchemy.org/en/rel_0_9/core/sqlelement.html?highlight=case#sqlalchemy.sql.expression.case). – Jon

+0

@ Jon Рад помочь! Кроме того, спасибо за включение этой ссылки. Я также добавил его к моему ответу выше, если кому-то это понадобится. –

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