将数据从 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']]
在我的 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']]