繁体   English   中英

将 Postgres 行导出为 JSON 文件

[英]Exporting Postgres Rows as a JSON File

我需要为我网站上的 dataTables 部分生成一个 JSON 文件。 JSON 的格式应如下所示:

{
        "data": [
                [
                        "Tiger Nixon",
                        "System Architect",
                        "Edinburgh",
                        "5421",
                        "2011/04/25",
                        "$320,800",
                ],
                [
                        "Garrett Winters",
                        "Accountant",
                        "Tokyo",
                        "8422",
                        "2011/07/25",
                        "$170,750"
                ],
        ]
}

这种格式看起来像是JSON 创建函数(表 9-42)中列出的数组数组。--array_to_json。

但是,我的数据没有以数组的形式存储在我的数据库中。 这是典型的行数据。

但是当我尝试使用“row_to_json”导出到 JSON 时——格式与我需要的相差甚远。 请参阅此 SQLfiddle 示例。

基本上,我试图找出使 JSON 导出看起来更像上面粘贴的格式的最佳方法。

我应该先将行重新格式化为数组,然后将它们存储在新表中,所以当我使用“row_to_json”时,它们会作为数组出现? 或者,还有更好的方法?

选择行作为数组并使用json_agg(array_to_json(...))

select 
    json_build_object(
        'data', 
        json_agg(array_to_json(array[price::text, qty::text])))
from data;

                 json_build_object                  
----------------------------------------------------
 {"data" : [["11","11"], ["22","11"], ["33","11"]]}
(1 row)

你需要在Postgres 9.4中引入一个函数,所以SqlFiddle是没用的。

您可以为此使用spyql

$ psql -U my_user -h my_host -c "SELECT * FROM my_table" --csv my_db | spyql -Oindent=4 "SELECT list_agg(_values) AS data FROM csv TO json"
{
    "data": [
        [
            "1",
            "David",
            "5.1"
        ],
        [
            "2",
            "James",
            "2.1"
        ],
        [
            "3",
            "Joana",
            ""
        ],
        [
            "4",
            "Hellen",
            "9.8"
        ]
    ]
}

我们使用 psql 将查询/表导出为 CSV,然后使用 spyql 将 CSV 转换为 json。 _values中的_values变量包含一个列表,其中包含自动类型转换之前每列的值,因此所有值都是字符串。 如果您更喜欢使用强制转换的值,则可以改用cols变量。 list_agg将所有行聚合到一个数组中。 如果使用cols而不是_values ,您会得到以下_values (还要注意 NULL 值的处理):

$ psql -U my_user -h my_host -c "SELECT * FROM my_table" --csv my_db | spyql -Oindent=4 "SELECT list_agg(cols) AS data FROM csv TO json"
{
    "data": [
        [
            1,
            "David",
            5.1
        ],
        [
            2,
            "James",
            2.1
        ],
        [
            3,
            "Joana",
            null
        ],
        [
            4,
            "Hellen",
            9.8
        ]
    ]
}

作为记录,我使用以下 SQL 命令创建了示例表:

CREATE TABLE my_table AS
SELECT *
FROM (VALUES (1, 'David', 5.1), (2, 'James', 2.1), (3, 'Joana', NULL), (4, 'Hellen', 9.8)) 
  AS t(id, name, score);

免责声明:我是 spyql 的作者

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM