2011-09-16 5 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'); 

session.query(AlphabetTable).filter(AlphabetTable.letter.in_:SQLAlchemyのために

letter 
------ 
    g 
    a 
    c 
    k 

、私はの線に沿って物事をしようとしてきました(アルファベット表。レター.in(( 'g'、 'a'、 'c'、 'k')))

どちらがうまくいかず...アイデアはありますか?小さな1回限りの定数リストなので、注文してテーブルを作成してから参加することもできますが、それはあまりにも多すぎるようです。

+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 expressionorder by field句を生成するために使用することができます。

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