SQLAlchemy Pandas的read_sql从jsonb读取
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)在不能接受记录类型的上下文中调用返回记录的函数
问题的原因是在使用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字段,欢迎提供反馈。
文章整理完毕,内容如上所示。