SQLAlchemy 使用 FIELD() 排序

9 投票
2 回答
10753 浏览
提问于 2025-04-17 02:26

我想按照某个字段对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))))

撰写回答