You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Shell脚本逐行读取PostgreSQL表数据并生成指定JSON

如何用Shell脚本逐行读取PostgreSQL表数据并转为指定JSON格式

嘿,我来帮你搞定这个问题!你之前用while read的方法出现格式混乱,核心原因是psql默认输出是空格对齐格式,read会把所有空格(包括用来对齐的空格)当成字段分隔符,自然会把数据拆得乱七八糟。而且要转成你要的JSON格式,其实有两种更靠谱的思路,给你详细说:

方法一:直接用PostgreSQL内置JSON函数生成(最推荐)

PostgreSQL本身就有超强的JSON处理能力,直接在SQL里生成你要的格式是最省心的——完全不用Shell处理复杂的文本分割,还能自动处理特殊字符转义。

针对你的student表,你可以用json_agg把整表数据转成JSON数组,配合json_build_object来构造每个对象,同时把Yes/No转成1/0:

psql -d db_name -t -c "
SELECT json_agg(
  json_build_object(
    'id', id,
    'name', name,
    'age', age,
    'inSchool', CASE WHEN inSchool = 'Yes' THEN 1 ELSE 0 END
  )
) FROM student;"

这个命令会直接输出标准的JSON数组,和你想要的格式几乎完全一致(如果一定要保留你示例里的分号结尾,可以用sed 's/},/};/g'做个替换,但更建议用标准JSON格式)。

方法二:Shell脚本逐行处理(适合需要自定义逻辑的场景)

如果必须用Shell来逐行处理数据,那得先解决字段分隔和列名对应的问题,下面是完整的脚本示例:

#!/bin/bash

# 配置数据库和表名
DB_NAME="db_name"
TABLE_NAME="student"

# 第一步:获取表的列名(按顺序用制表符分隔)
COLUMNS=$(psql -d "$DB_NAME" -t -c "SELECT string_agg(column_name, E'\\t') FROM information_schema.columns WHERE table_name = '$TABLE_NAME' ORDER BY ordinal_position;")

# 第二步:用psql输出制表符分隔的原始数据(去掉表头、无对齐空格)
psql -d "$DB_NAME" -A -F $'\t' -t -c "SELECT * FROM $TABLE_NAME;" | while IFS=$'\t' read -r id name age inSchool; do
    # 处理布尔值:Yes转1,No转0
    inSchool_val=$([ "$inSchool" = "Yes" ] && echo 1 || echo 0)
    # 输出单个JSON对象
    echo " { id : $id, name : $name, age : $age, inSchool : $inSchool_val; },"
done | sed '$ s/,$//' | {  # 去掉最后一行的多余逗号
    echo "["
    cat -
    echo "]"
}

关键细节说明:

  • -A:让psql输出无对齐格式,去掉多余的空格
  • -F $'\t':指定字段分隔符为制表符,确保每个字段的值不会被空格拆分
  • IFS=$'\t' read -r ...:告诉read命令用制表符分割每行数据,保证每个字段都能正确读取
  • 最后用sed去掉最后一行的逗号,再包裹上数组的[],就得到你要的格式了

不过还是强烈推荐方法一,因为数据库内置的JSON函数能处理各种边缘情况(比如字段值含空格、引号),而Shell脚本处理这些会非常麻烦,容易出错。

内容的提问来源于stack exchange,提问作者Nitin Singhal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:07:49