python - Sqlalchemy 以相同的顺序获得结果

标签 python list sorting sqlalchemy

我正在使用此查询

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

我希望按照与 user_ids 中相同的顺序获取用户。无论如何,我可以直接在查询中执行此操作,还是必须再次对其进行排序?另外,如果我必须再次对其进行排序,那么根据另一个 ID 列表对对象列表进行排序的 Python 方式是什么。

最佳答案

对于 PostgreSQL 9.4+ 和 SQLAlchemy 0.9.7+,这很有可能,尽管很难看。基本上,我们构建 id -> 序数的映射,然后使用 JSONB -> 运算符查找每个用户 id 的序数(-> 需要 TEXT

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

关于python - Sqlalchemy 以相同的顺序获得结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29322656/

相关文章:

python - 基于PHP代码在Python中创建MD5哈希

python - 是否有一个装饰器可以简单地缓存函数返回值?

c# - 在 C# 中使用日期对字符串列表进行排序

Python 3.3 列表帮助

javascript - 删除 dynamodb 中的列表元素,索引是存储在变量中的值

r - 减少部分排序

SQLite 查询使用 TEMP B-TREE FOR ORDER BY 而不是索引

python - 使用sqlalchemy.sql.functions.char_length作为过滤条件

python - Python 中列表理解的错误处理

python - 按字母顺序对二维列表进行排序?