使用psycopg2从PostgreSQL导出JSON出现嵌套列表格式错误如何解决?
问题原因
- psycopg2的
fetchall()方法返回值固定为「查询结果行组成的列表」,每行数据以元组格式存储,即使查询仅返回1行1列的结果,也会被封装为[(结果值,)]的结构 - 你当前使用的SQL语句最终返回的是单个JSON数组值,因此会被外层的列表+元组嵌套两层,最终得到你看到的额外嵌套结构
修复方法
方案1:不修改现有SQL,直接取值
既然目标数据在返回结果的第一层列表第一个元素(元组)的第一个位置,直接按索引取值即可:
def load_authors(self): sql = "select array_to_json(array_agg(row_to_json(t))) from (select id, name from authors) t" self.curs.execute(sql) # 取第一行的第一个元素即可 data = self.curs.fetchone()[0] print(data) return data
方案2:简化查询逻辑,不用SQL层面处理JSON
更推荐这种写法,可读性更高也不容易出错,直接查询原始字段后在Python侧拼装目标格式:
def load_authors(self): sql = "SELECT id, name FROM authors" self.curs.execute(sql) # 遍历查询结果直接拼装字典列表 data = [{'id': row[0], 'name': row[1]} for row in self.curs.fetchall()] print(data) return data
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

