SQLAlchemy 使用 FIELD() 排序
我想按照某个字段对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_(('g','a','c','k'))).order_by(AlphabetTable.letter.in_(('g','a','c','k')))
但是这样不行……有没有什么好主意?这个列表很小,只用一次,我本可以创建一个表来存储顺序,然后再连接,但这样似乎有点麻烦。
2 个回答
15
SQLAlchemy中的函数表达式可以用来生成按字段排序
的语句:
session.query(AlphabetTable) \
.filter(AlphabetTable.letter.in_("gack")) \
.order_by(sqlalchemy.func.field(AlphabetTable.letter, *"gack"))
11
这可能不是一个很完美的解决办法,但你可以试试用一个叫做case 表达式来代替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))))