SQLAlchemy ЗАКАЗАТЬ ПО ПОЛЕ () - PullRequest
       22

SQLAlchemy ЗАКАЗАТЬ ПО ПОЛЕ ()

8 голосов
/ 16 сентября 2011

Я пытаюсь отсортировать объект SQLAlchemy ORM по полю, но с определенным порядком значений (который не является ни восходящим, ни убывающим). Если бы я делал этот запрос на MySQL, он бы выглядел так:

SELECT letter FROM alphabet_table WHERE letter in ('g','a','c','k')
ORDER BY FIELDS( letter, 'g','a','c','k');

для вывода:

letter
------
  g
  a
  c
  k

Для SQLAlchemy я пробовал что-то вроде:

session.query (AlphabetTable) .filter (AlphabetTable.letter.in _ (( 'г', 'а', 'с', 'к'))). Order_by (AlphabetTable.letter.in _ (( 'г' , 'а', 'с', 'к')))

Что не работает ... какие-либо идеи? Это небольшой одноразовый постоянный список, и я мог бы просто создать таблицу с порядком и затем присоединиться, но это кажется слишком много.

Ответы [ 2 ]

12 голосов
/ 05 июля 2013

Выражение sqlalchemy func может использоваться для генерации предложения order by field:

session.query(AlphabetTable) \
    .filter(AlphabetTable.letter.in_("gack")) \
    .order_by(sqlalchemy.func.field(AlphabetTable.letter, *"gack"))
7 голосов
/ 16 сентября 2011

Возможно, это не очень удачное решение, но как насчет использования выражения вместо order by fields:

sqlalchemy.orm.Query(AlphabetTable) \
    .filter(AlphabetTable.letter.in_("gack")) \
    .order_by(sqlalchemy.sql.expression.case(((AlphabetTable.letter == "g", 1),
                                              (AlphabetTable.letter == "a", 2),
                                              (AlphabetTable.letter == "c", 3),
                                              (AlphabetTable.letter == "k", 4))))
...