Bash脚本和PostgreSQL:如何访问从SELECT语句返回的列值

7

我有一个名为customers的PostgreSQL数据库,其中有一个名为CustomerInfo的表。CustomerInfo包含3列ID、Name和address。我想编写一个bash脚本来从CustomerInfo表中获取信息,但我不确定在获得查询结果后如何访问各个行。以下是我写的脚本:

#!/bin/bash  

results=`psql -d customers -c "select * from CustomerInfo where name = 'Dave'"`

echo $results['name']

查询正确运行并返回正确结果,但echo命令只会打印结果中的所有内容。我知道这不是正确的做法,有没有人知道一种将查询结果作为数组获取的方法,或者我只需要编写自己的解析结果的函数吗?
谢谢!

1
用bash完成这种事情所需的工作量,不如花时间学习Perl的基础知识。 - Daniel Vérité
在尝试自己编写任何内容之前,您必须意识到您正在做什么:执行一个命令并将其输出(文本)存储在变量中。因此,您需要解析和拆分该文本以使此事可行。 - mistapink
4个回答

9
你可以将结果存储到数组中,并使用while循环遍历它。
psql -d customers -c "select * from CustomerInfo where name = 'Dave'"
| while read -a Record ; do
    # ${Record[0]} is your ID field
    # ${Record[1]} is your Name field
    # ${Record[2]} is your address field
done

1
如果您只想迭代值(而不是描述列的标题),请在psql命令中添加-t。 - Devon Peticolas
我做错了什么吗?我只是让整行都出现在${Record[0]}中。它看起来像是1|ed393959-6c5f-4f79-a9b9-11516c3c8990|Recordblabla|2021-06-16 - botenvouwer

8
我使用以下方式成功地完成了操作:
psql | while read do 

方法:

$PG_HOME/bin/psql \
-h 127.0.0.1 \
-U $DB_USER \
-c 'SELECT recipient_email, name FROM report_recipients' \
--set ON_ERROR_STOP=on \
--no-align \
--quiet \
--no-password \
--tuples-only \
--field-separator ' ' \
--pset footer=off \
--dbname=$DATABASE \
| while read EMAIL_ADDRESS NAME   ; do
    echo "$SCRIPT: addr=$EMAIL_ADDRESS  name=$NAME"
done

这里有一个非常好的资源,与此类似的内容都可以在这里找到:manniwood.com的PostgreSQL和bash Stuff页面


在尝试将psql输出导入while时,以上方法会出现奇怪的错误:第18行:语法错误,第31行:“|”不期望参考相关行:$PSQL \ -X \ -h $host \ -U $username \ -c "$id_sql" \ --single-transaction \ --set AUTOCOMMIT=off \ --set ON_ERROR_STOP=on \ --no-align \ -t \ --field-separator ' ' \ --dbname $dbname \ --quiet | while read id_num name ; do - user2275460

0
你不能这样做。你必须编写自己的函数来解析查询结果。反引号(`)将执行命令并返回输出。在你的情况下,结果将包含查询的输出。

-2

如果我被指派完成这个任务(实际上,Perl更好,采纳@daniel-verite的建议),以下是我的做法。

  1. 通过管道将初始结果传递到head来获取列名列表
  2. 创建一个函数,使用awk将其余部分解析成有用的格式。
  3. 使用sed或awk从行中提取相关信息。

现在,以上假设没有嵌入换行符(这会使事情复杂化)

这需要付出相当大的努力。对于这样的任务,学习Perl确实更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接