postgresql 按JSON数据类型SQLAlchemy排序

jhkqcmku  于 2023-02-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(140)

我有一个Postgres表,其中有一个JSON类型的列,列中有一堆JSON对象,我想查询表中的记录,并按存储在JSON字段中的键值对结果进行排序。

row1 {'2011': 600, '2012': 100, '2014': 200}
row2 {'2011': 700, '2012': 100, '2014': 200}
row3 {'2011': 500, '2012': 100, '2014': 200}

我怎样才能提出这样的要求:

Table.query.order_by(Table.data['2011']).all()

结果:

500
600
700

我已经尝试了查询:

Table.query.order_by(Table.data.cast(JSON)['2011']).all()
Table.query.order_by(Table.data(JSON)['2011']).all()

但是我总是得到各种各样的错误

ttygqcqt

ttygqcqt1#

您可以通过将值提取为文本,然后转换为整数来完成此操作。具体如何执行此操作取决于数据库和模型中的列类型。
如果数据库中的列类型是JSON,而模型中的列类型是SQLAlchemy的通用JSON类型,则需要将值强制转换为文本类型,然后再转换为数值类型。

# Get these from the db namespace if using Flask-SQLAlchemy
from sqlalchemy import cast, Integer, String
...
Table.query.order_by(cast(cast(tbl.c.data['2011'], String), sa.Integer)).all()

如果数据库中的列是JSON,并且模型中的列类型是SQLAlchemy的PostgresSQL方言中的JSON类型,则可以使用列的astext属性,而不是强制转换为文本类型(可以在模型中将列类型从通用JSON更改为Postgres JSON,但必须进行迁移)。

from sqlalchemy.dialects.postgresql import JSON
...
Table.query.order_by(cast(Table.data['2011'].astext, Integer)).all()

如果数据库中的列类型为JSONB,模型中的列类型为JSONB,则可以直接使用该值:

from sqlalchemy.dialects.postgresql import JSONB
...
Table.query.order_by(Table.data['2011']).all()

相关问题