SQLAlchemy ORDER BY FIELD()

9

我想对一个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(case([(AlphabetTable.letter=='g',1),(AlphabetTable.letter=='a',2),(AlphabetTable.letter=='c',3),(AlphabetTable.letter=='k',4)], else_=5))

这样做不起作用...有什么想法吗?这是一个小的一次性常量列表,我可以创建一个带有顺序的表然后进行连接,但那似乎有点过分。


你能否从SQLAlchemy调用MySQL存储过程? - Louis
2个回答

15

可以使用SQLAlchemy的func表达式生成order by field子句:

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

11

这可能不是一个非常令人满意的解决方案,但可以考虑使用case表达式来代替按字段排序

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))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接