Python:将PostgreSQL查询结果检索为格式化的JSON值

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

我正在使用一个包含多个表的postgres数据库。目标是从获得的查询结果中检索格式化的JSON。我创建了这个从表(测试用例)获取数据集的python脚本,以便操作查询结果:

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
    lat
    字段合并为单个JSON值,如
    coordinate[log,lat]
因此,返回的JSON格式如下:

{
    "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