如何用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
相关产品推荐
相关产品推荐

