SQLAlchemy Pandas的read_sql从jsonb读取

6 浏览
0 Comments

SQLAlchemy Pandas的read_sql从jsonb读取

我想使用pandas的read_sql从我的SQLAlchemy查询中生成一个数据帧,其中包含一个PostgreSQL的jsonb属性作为列。

实际上,这将给出我的答案:

query = session.query(
    cls.id,
    cls._my_jsonb_column
).all()
pd.DataFrame.from_dict([dict(id=id_, **i) for id_,i in query])

但是,我更希望在PostgreSQL中解压缩jsonb,而不是在应用程序中进行。

我的尝试给出了以下结果:

query = session.query(
    cls.id,
    func.jsonb_to_record(cls._my_jsonb_column)
)
pd.read_sql(query.statement, query.session.bind)

(psycopg2.NotSupportedError)在不能接受记录类型的上下文中调用返回记录的函数

0
0 Comments

问题的原因是在使用SQLAlchemy和Pandas的read_sql函数从jsonb字段中读取数据时遇到了困难。解决方法是使用SQLAlchemy的func.jsonb_to_record函数将jsonb字段转换为可查询的对象,然后将其与原始表格进行连接。

具体的解决方法如下:

1. 使用func.jsonb_to_record(cls._my_jsonb_column)将jsonb字段转换为可查询的对象。

2. 使用session.query函数创建一个查询对象。

3. 在查询对象中使用select函数选择需要的列。

4. 使用select_from函数将原始表格与jsonb数据表格进行连接。

5. 最后执行查询并获取结果。

代码示例如下:

jsonb_data = func.jsonb_to_record(cls._my_jsonb_column)
query = session.query(
    select(
        [cls.id, ]
    ).select_from(
        cls.join(jsonb_data, )
    )
)

另外,还可以使用PostgreSQL的JSON处理函数来展平JSON数据,但是没有给出JSON数据结构的情况下无法给出更具体的方法。

另外,作者最近发布了一个名为pg_jsonb_flattener的包,可以根据JSON数据的描述轻松展平JSONB字段,欢迎提供反馈。

文章整理完毕,内容如上所示。

0