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())
一个 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())