python 将 sqlalchemy json 数组结果转储到 json 文件中

python dump sqlalchemy json array result into json file

一个 postgres 查询 returns json 数组,我正试图将其转储到 json 文件中。

query = f"""
           SELECT array_to_json(array_agg(results))
           FROM 
           (SELECT * from lookup_brands limit 1000) as results
        """ 
        json_results = exec_query(self.conn_string, query)
        print(json_results) # outputs <sqlalchemy.engine.cursor.LegacyCursorResult object at 0x7f30d64bd8b0>
        print(type(json_results) # outputs <class 'sqlalchemy.engine.cursor.LegacyCursorResult'>

我尝试将 json_results 写成 json,例如:

with open(output_path, 'w') as outfile:
     json.dump(json_results, outfile)

我收到这个错误

error Object of type LegacyCursorResult is not JSON serializable

这是预期的。

如何将这个 json 数组结果转储到文件中?

SQLAlchemy 的 LegacyCursorResult 对象是结果集的迭代器,结果中的值被转换为它们的 Python 等价物。您需要创建一个可以从结果中自行序列化的对象,例如:

with engine.connect() as conn:    
    result = conn.execute(sql)    
    print(json.dumps([dict(row) for row in result.mappings()]))

这看起来很浪费,因为 Postgresql 已经序列化了数据。我们可以通过在数据库端将查询结果转换为 text 来解决这个问题,这样我们就可以将其作为有效的 JSON str:

sql = """\
SELECT array_to_json(array_agg(results))::text AS data
FROM
(SELECT * FROM t70692551) AS results
"""

with engine.connect() as conn:
    result = conn.execute(sql)
    print(result.scalar_one())