Python:将PostgreSQL查询结果检索为格式化的JSON值
我正在使用一个包含多个表的postgres数据库。目标是从获得的查询结果中检索格式化的JSON。我创建了这个从表(测试用例)获取数据集的python脚本,以便操作查询结果:Python:将PostgreSQL查询结果检索为格式化的JSON值,python,sql,json,python-3.x,postgresql,Python,Sql,Json,Python 3.x,Postgresql,我正在使用一个包含多个表的postgres数据库。目标是从获得的查询结果中检索格式化的JSON。我创建了这个从表(测试用例)获取数据集的python脚本,以便操作查询结果: import psycopg2 import json from time import sleep from config import config def main(): conn = None try: params = config() conn = psycopg
import psycopg2
import json
from time import sleep
from config import config
def main():
conn = None
try:
params = config()
conn = psycopg2.connect(**params)
cur = conn.cursor()
cur.execute("select * from location")
row = cur.fetchone()
while row is not None:
print(row)
#do field rename, merge(log, lat) and obtained JSON here
sleep(0.3)
row = cur.fetchone()
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
if __name__ == '__main__':
main()
为了澄清我的问题,我在这里生成了一个简化的场景,用3个表表示手头的任务,如下所示
environment
╔════════╦═══════════╦══════╦══════╗
║ env_id ║ placem_id ║ humd ║ wind ║
╠════════╬═══════════╬══════╬══════╣
║ 104║ 4 ║ 48 ║ 119 ║
║ 68 ║ 9 ║ 39 ║ 141 ║
╚════════╩═══════════╩══════╩══════╝
placement
╔═══════════╦════════╦═══════════════╦══════════════════════════╗
║ placem_id ║ loc_id ║ description ║ date ║
╠═══════════╬════════╬═══════════════╬══════════════════════════╣
║ 4 ║ 64 ║ description_1 ║ 2019-03-12T20:40:35.967Z ║
║ 7 ║ 5 ║ description_2 ║ 2019-03-12T20:56:51.319Z ║
╚═══════════╩════════╩═══════════════╩══════════════════════════╝
location
╔════════╦═══════════╦═══════════╦════════════════════╗
║ loc_id ║ log ║ lat ║ address ║
╠════════╬═══════════╬═══════════╬════════════════════╣
║ 64 ║ 13.3986 ║ 52.5547 ║ Bosebrucke Einkauf ║
║ 71 ║ 21.150122 ║ -6.607044 ║ Charlotte Court ║
╚════════╩═══════════╩═══════════╩════════════════════╝
以下是我想要实现的目标:
- 从数据库检索记录
- 在JSON名称/值中根据需要重命名部分字段(例如,
变为humd
和relativeHumidity
变为wind
windSpeed
- 将
和log
字段合并为单个JSON值,如lat
coordinate[log,lat]
{
"relativeHumidity": 48,
"windSpeed": 119,
"address": "Bosebrucke Einkauf",
"location": {
"coordinates": [13.3986, 52.5547]
}
}
虽然这个问题可能看起来是重复的,但是,我尝试了许多类似问题中的建议,比如一个,但这些都不起作用
外面有人能提供一个指南吗?我认为这应该比较容易做到:
非常感谢这篇短小而精确的文章。它确实有效。我第一次遇到这个db FIDLE。假设我希望每个记录作为单个JSON对象返回,而不是作为单个JSON返回整个查询结果(假设我希望每个记录每1秒一次)。我如何修改上述查询?正在处理它,但没有成功(编写python脚本)。只需删除
json\u agg
-
select
json_agg(to_json(d))
from (
select
e.humd as "relativeHumidity",
e.wind as "windSpeed",
l.address,
json_build_object(
'coordinates',
json_build_array(l.log, l.lat)
) as location
from environment as e
inner join placement as p on
p.placem_id = e.placem_id
inner join location as l on
l.loc_id = p.loc_id
) as d