Sqlalchemy以相同的顺序获得结果

时间:2015-03-28 21:09:18

标签: python list sorting sqlalchemy

我正在使用此查询

users = User.query.filter(User.id.in_(user_ids)).all()

我希望usersuser_ids中的顺序相同。无论如何我可以直接在查询中执行此操作,还是我必须再次对其进行排序?另外,如果我必须再次排序,那么基于另一个ID列表对对象列表进行排序的pythonic方法是什么。

1 个答案:

答案 0 :(得分:1)

这很可能,虽然丑陋,PostgreSQL 9.4 + 和SQLAlchemy 0.9.7 + 。基本上我们建立了一个id - >的地图。 ordinal,然后使用JSONB ->运算符查找每个用户ID的序数(->需要TEXT用于JSON密钥

from sqlalchemy.sql.postgresql import JSONB, TEXT
from sqlalchemy.sql import cast

id_order = { str(v): k for k, v in enumerate(user_ids) }
users = User.query.filter(User.id.in_(user_ids)).\
    order_by(cast(id_order, JSONB)[cast(User.id, TEXT)])

这将创建类似于

的SQL ORDER BY
ORDER BY CAST('{"1": 2, "3": 0, "2": 1}' AS JSONB) ->
         CAST(user.id AS TEXT)

对于其他数据库,只需在客户端中对其进行排序 - 但这意味着您无法浏览结果。

在客户端上排序的有效代码是:

id_order = { v: k for k, v in enumerate(user_ids) }
users = sorted(users, key=lambda u: id_order.get(u.id))