【问题标题】:Exporting Postgres Rows as a JSON File将 Postgres 行导出为 JSON 文件
【发布时间】:2016-11-01 21:52:38
【问题描述】:

我需要为我网站上的 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 Creation Functions (Table 9-42.) -- array_to_json 中列出的数组数组。

但是,我的数据并未作为数组存储在我的数据库中。这是典型的行数据。

但是当我尝试使用“row_to_json”导出到 JSON 时,格式与我需要的格式相去甚远。 See this SQLfiddle example.

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

我是否应该首先将我的行重新格式化为数组,并将它们存储在一个新表中,所以当我使用“row_to_json”时,它们会以数组的形式出现?还是有更好的办法?

【问题讨论】:

    标签: arrays json postgresql


    【解决方案1】:

    您可以为此使用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。 spyql 中的_values 变量包含一个列表,其中包含自动类型转换之前每列的值,因此所有值都是字符串。如果您更喜欢强制转换的值,您可以改用 cols 变量。 list_agg 将所有行聚合到一个数组中。如果使用 cols 而不是 _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的作者

    【讨论】:

      【解决方案2】:

      选择行作为数组并使用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没用。

      【讨论】:

      • json_build_object 来自 9.4
      • SQLFiddle 还是很烦人
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多