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

时间:2015-09-04 17:55:49

标签: python json postgresql dictionary sqlalchemy

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

以前,我只是使用CSV(和Pandas' read_csv函数)来执行我的分析,但现在我已经开始直接从PostgreSQL中提取数据了。

使用SQLAlchemy连接到我的引擎并运行查询没有问题。我的整个脚本运行与从CSV中提取数据时的运行方式相同。也就是说,直到它到达我试图将其中一个列(即下面的示例文本中的' config'列)从JSON转换为Python字典的部分。将其转换为字典的最终目标是能够计算"选项下的响应数量。 " config"中的字段柱。

df = pd.read_sql_query('SELECT questions.id, config from questions ', engine)

df = df['config'].apply(json.loads)

df = pd.DataFrame(df.tolist())

df['num_options'] = np.array([len(row) for row in df.options])

当我运行它时,我得到错误" TypeError:期望的字符串或缓冲区"。我尝试在'配置中转换数据。从对象到字符串的列,但是没有做到这一点(我得到了另一个错误,例如" ValueError:期望属性名称......")。

如果有帮助,可以在“配置”中的一个单元格中剪切数据。列(代码应返回结果' 6'为此剪切,因为有6个选项):

{"graph_by":"series","options":["Strongbow Case Card/Price Card","Strongbow Case Stacker","Strongbow Pole Topper","Strongbow Base wrap","Other Strongbow POS","None"]}

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

2 个答案:

答案 0 :(得分:1)

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

df = df['config']['options']

来自Psycopg手册:

  

Psycopg可以在PostgreSQL json和jsonb类型之间调整Python对象。使用PostgreSQL 9.2及以下版本,可以开箱即用。要将JSON数据与以前的数据库版本一起使用(使用9.1 json扩展,但即使您想将文本字段转换为JSON),也可以使用register_json()函数。

答案 1 :(得分:0)

只需sqlalchemy查询:

q = session.query(
    Question.id,
    func.jsonb_array_length(Question.config["options"]).label("len")
)

sql和pandas'read_sql_query

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)