2011-09-16 16 views
6

Próbuję posortować obiekt ORM SQLAlchemy za pomocą pola, ale o określonej kolejności wartości (która nie jest ani rosnąco ani malejąco). Gdybym robił to zapytanie w MySQL, wyglądałoby to jak;SQLAlchemy ORDER BY FIELD()

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

na wyjściu:

letter 
------ 
    g 
    a 
    c 
    k 

Dla SQLAlchemy, Próbowałem rzeczy wzdłuż linii:

session.query (AlphabetTable) .filter (AlphabetTable.letter.in_ (("g", "a", "c", "k"))) order_by (AlphabetTable.letter.in _ (("g", "a", "c", "k")))

Które nie działa ... jakieś pomysły? Jest to mała jednorazowa lista stała i mogłem po prostu utworzyć tabelę z zamówieniem, a następnie dołączyć, ale wydaje się to trochę za dużo.

+0

Czy ty wywołać procedurę przechowywaną mysql z sqlalchemy? – Louis

Odpowiedz

7

To nie może być bardzo satysfakcjonujące rozwiązanie, ale jak o użyciem case expression zamiast 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)))) 
8

sqlalchemy func expression może być używany do generowania order by field klauzuli:

session.query(AlphabetTable) \ 
    .filter(AlphabetTable.letter.in_("gack")) \ 
    .order_by(sqlalchemy.func.field(AlphabetTable.letter, *"gack"))