将数据从 psql 导出到 json 格式错误

exporting data from psql to json formatted wrong

在我的 Flask 应用程序中,我正在尝试练习从 psql table 中获取数据并将其放入下拉列表中。我正在使用它通过来自 here:

的查询通过 psycopg2 获取数据
def load_authors(self):
    # sql = "SELECT * FROM authors"
    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.fetchall()
    print(data)
    return data

这是我的 psql 数据,我想将其格式化为 json:

[(1, 'Christopher Paolini'), (2, 'Marie Lu'), (3, 'John Flanagan')]

前面的代码将数据导出到这个:

[([{'id': 1, 'name': 'Christopher Paolini'}, {'id': 2, 'name': 'Marie Lu'}, {'id': 3, 'name': 'John Flanagan'}],)]

它似乎采用了我想要的格式正确的 json:

[{'id': 1, 'name': 'Christopher Paolini'}, {'id': 2, 'name': 'Marie Lu'}, {'id': 3, 'name': 'John Flanagan'}]

并将其放入另一个列表中?我对此还没有很深入的了解,所以我想知道为什么要这样做以及如何解决它。我尝试了多个不同的查询,但到目前为止它们都是 return 列表中的列表。

快速回答是使用 array_to_json 通常会导致嵌套数组。甚至文档也说明了这一点。

array_to_json('{{1,5},{99,100}}'::int[])

产量

[[1,5],[99,100]]

相反,这里有一种方法会更适合您。

SELECT
  json_build_object(
    'authors',
    json_agg(authors)
  ) authors
from
  (
    select
      authors.id as id,
      authors.name as name
    from
      authors
  ) authors

这会产生

{
  "authors": [
    {
      "id": 920,
      "name": "Ryan"
    },
    {
      "id": 3399,
      "name": "John"
    }
  ]
}

json_build_object 允许您使用交替 key/value 对构建自定义对象。像这样:

json_build_object('foo',1,'bar',2)

产生

{"foo": 1, "bar": 2}

在这种情况下,我们正在构建一个对象,该对象具有 authors 键和 json_agg(authors) 值,这会将我们的 authors 查询转换为由以下别名查询返回的行数组.

绕过大脑有点难,但它非常高效,我推荐这种技术,用于快速从数据库中抓取大量 JSON 数据。

通常row_to_json就足够了:

cur = con.cursor()
query = '''
    select row_to_json(t) as obj from (
        select id, usage from products where id < 5
    ) t
'''

cur.execute(query)
data = cur.fetchall()
print([x[0] for x in data])
print([list(x[0].values()) for x in data])

输出:

[{'id': 2, 'usage': 'shop'}, {'id': 4, 'usage': 'shop'}]
[[2, 'shop'], [4, 'shop']]