sqlalchemy - 如何按值对字典文本字段进行排序

时间:2018-01-23 02:55:54

标签: python sqlalchemy

我有一个类模型定义如下:

class Order(orm.Model):
    __tablename__ = "order_index"
    id = orm.Column(orm.BigInteger, primary_key=True)
    detail = orm.Column(orm.TEXT)
query = Order.query.filter(some_filter)

详细信息行是字典格式。(等:{"status": 1, "win_price": 0,..}) 如何使用win_price

键对查询结果进行排序

1 个答案:

答案 0 :(得分:1)

由于您的架构无法更改,因此您必须使用CASTJSON

In [20]: session.query(Order.detail).\
    ...:     order_by(Order.detail.cast(JSON)['win_price']).\
    ...:     all()

将发出以下SQL:

SELECT order_index.detail AS order_index_detail 
FROM order_index
ORDER BY JSON_EXTRACT(CAST(order_index.detail AS JSON), %(param_1)s)

用params:

{'param_1': '$."win_price"'}

如果您碰巧使用的是早于1.1的SQLAlchemy(引入了MySQL JSON支持),但使用的是MySQL 5.7.8或更高版本,那么您可以手动形成所需的查询:

In [13]: session.query(Order.detail).\
    ...:     order_by(func.json_extract(Order.detail, '$."win_price"')).\
    ...:     all()