使用随SQLAlchemy导入的Postgresql数据将JSON转换为Python Dict

使用随SQLAlchemy导入的Postgresql数据将JSON转换为Python Dict,python,json,postgresql,dictionary,sqlalchemy,Python,Json,Postgresql,Dictionary,Sqlalchemy,关于将JSON字符串转换为Python数据字典以便在Pandas中进行分析,这里有一个棘手的问题。我已经读了很多关于这个问题的其他问题,但似乎没有一个适合我的情况 以前,我只是简单地使用csv(和Pandas的read_csv函数)来执行我的分析,但现在我开始直接从PostgreSQL中提取数据 我可以使用SQLAlchemy连接到我的引擎并运行我的查询。我的整个脚本的运行方式与我从CSV中提取数据时的运行方式相同。也就是说,直到我尝试将其中一列(即下面示例文本中的'config'列)从JSON

关于将JSON字符串转换为Python数据字典以便在Pandas中进行分析,这里有一个棘手的问题。我已经读了很多关于这个问题的其他问题,但似乎没有一个适合我的情况

以前,我只是简单地使用csv(和Pandas的read_csv函数)来执行我的分析,但现在我开始直接从PostgreSQL中提取数据

我可以使用SQLAlchemy连接到我的引擎并运行我的查询。我的整个脚本的运行方式与我从CSV中提取数据时的运行方式相同。也就是说,直到我尝试将其中一列(即下面示例文本中的'config'列)从JSON转换为Python字典为止。将其转换为dict的最终目标是能够计算“config”列中“options”字段下的响应数

当我运行这个程序时,我得到一个错误“TypeError:expected string或buffer”。我尝试将'config'列中的数据转换为object中的字符串,但没有成功(我遇到了另一个错误,类似于“ValueError:Expecting property name…”)

如果有帮助的话,这里是从'config'列中的一个单元格中截取的数据(由于有6个选项,代码应该返回此截取的结果'6'):


我的猜测是,SQLAlchemy从数据库中提取JSON字符串时,对JSON字符串做了一些奇怪的事情?当我只是从数据库中提取CSV时不会发生什么事情?

在最近的
Psycopg
版本中,对Python的Postgresql json(b)自适应是透明的。Psycopg是Postgresql的默认SQLAlchemy驱动程序

df = df['config']['options']
从手册中:

Psycopg可以使Python对象适应PostgreSQL json和jsonb类型,也可以使Python对象适应PostgreSQL json和jsonb类型。对于PostgreSQL 9.2及以下版本,可即时进行自适应。要在以前的数据库版本中使用JSON数据(使用9.1 JSON扩展,但即使要将文本字段转换为JSON),也可以使用register_JSON()函数


只需
sqlalchemy
query:

q = session.query(
    Question.id,
    func.jsonb_array_length(Question.config["options"]).label("len")
)
sql
和pandas'
read\u sql\u query

sql = """\
SELECT  questions.id,
        jsonb_array_length(questions.config -> 'options') as len
FROM    questions
"""
df = pd.read_sql_query(sql, engine)
两者结合(我最喜欢):


很抱歉延迟回复您,但此操作非常有效,非常感谢您的分享!
q = session.query(
    Question.id,
    func.jsonb_array_length(Question.config["options"]).label("len")
)
sql = """\
SELECT  questions.id,
        jsonb_array_length(questions.config -> 'options') as len
FROM    questions
"""
df = pd.read_sql_query(sql, engine)
# take `q` from the above
df = pd.read_sql(q.statement, q.session.bind)