【问题标题】:Python: Fetching postgresql result and loading it to JSONPython:获取 postgresql 结果并将其加载到 JSON
【发布时间】:2020-01-10 16:29:25
【问题描述】:

我正在尝试从 PostgreSQL 获取有关某些摄像机的详细信息,我需要将它们全部插入到一个 JSON 响应中,但我无法想象应该如何完成,因为 for row in self.data: 每次处理一行,如何我可以将它们全部添加到一个 JSON 转储中吗?

我想象 JSON 转储是这样的:

{
    "status": "ok",
    "total_cameras": 3,
    "cameras":[{
        "camera_id" : 1,
        "camera_name" : "hikvision 1",
        "camera_ip": "42.51.56.0"
        },
        {
            "camera_id" : 2,
            "camera_name" : "hikvision 2",
            "camera_ip": "42.51.56.5"
        },
        {
            "camera_id" : 3,
            "camera_name" : "hikvision 3",
            "camera_ip": "2.1.58.5"
        }]
}

我用来从 PostgreSQL 获取信息的代码:

                if not self.Data:
                    self.RES = {'status': 'nocameras'}
                    return web.Response(text=json.dumps(self.RES), status=403)
                else:
                    self.rows = self.cursor.rowcount
                    for row in self.Data:
                        if self.rows > 1:
                            # Authorizing objects
                            print(row)
                            self.Camera_ID = row[0]
                            self.Camera_Name = row[1]
                            self.Camera_LAT = row[3]
                            self.Camera_LOG = row[4]
                            self.Camera_IP = row[2]
                            self.Camera_Last_Updated = row[6]
                            self.Camera_Street = row[5]
                            self.Camera_API_key = row[7]
                            print(self.Camera_ID, self.Camera_Name)
                        else:
                            self.RES = {'status': 'row_error'}
                            return web.Response(text=json.dumps(self.RES), status=500)

【问题讨论】:

  • 顺便说一句,我看到很多变量都存储为您的实例的属性(self.RESself.rowsself.Camera_ID 等),它们可能实际上应该是局部变量.通过将它们存储在self 上,您可以保留对所有内容的引用(直到下一次被覆盖),防止垃圾收集完成其工作并弄乱对象名称空间。如果方法返回后不需要变量,使用res = ...rows = ...等即可。
  • 我有 5 个摄像头存储在数据库中,假设 self.Camera_LAT 是纬度,所以它基本上每分钟更改一次,使用此代码,我将所有内容发送到网络服务器以显示所有摄像头在地图中

标签: python json postgresql


【解决方案1】:

我会首先使用返回的行来构建字典列表:

cameras = [
    dict(
        camera_id=c_id,
        camera_name=c_name,
        camera_ip=c_ip
    ) for c_id, c_name, _, _, c_ip, *_ in self.Data
]

然后创建最终的 JSON 对象:

json.dumps({
    'status': 'ok',
    'total_cameras': len(cameras),
    'cameras': cameras
})

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 2012-03-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多