2011-09-16 141 views
6

我想按字段排序SQLAlchemy ORM對象,但是按照值的具體順序(既不是升序也不是降序)。如果我在MySQL上做這個查詢,它會看起來像;SQLAlchemy ORDER BY FIELD()

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_ (('g','a','c','k')))。order_by(AlphabetTable.letter.in _(('','a','c','k')))

哪個行不通...有什麼想法?這是一個很小的一次性常量列表,我可以按照順序創建一個表然後加入,但這看起來有點太過分了。

+0

你可以從sqlalchemy調用一個mysql存儲過程? – Louis

回答

7

這可能不是一個非常令人滿意的解決方案,但如何使用的case expression代替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可以用來生成order by field條款:

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