将 PostgreSQL 查询结果存储到 Shell 或 PostgreSQL 变量中

8
例如,我有一个存储值的表格:
select * from myvalue;

  val
-------
 12345
(1 row)

如何在PostgreSQL或Shell脚本中将此12345保存到变量中?

以下是我在Shell脚本中尝试的内容:

var=$(psql -h host -U user -d db <<SQLSTMT
SELECT * FROM myvalue;
SQLSTMT)

但是echo $var却给了我以下输出:

val ------- 12345 (1 row)

我也尝试过

\set var (select * from myvalue)

在 psql 中,当我输入 \set 时,它会列出:

var = '(select*frommyvalue)'
6个回答

12
不,不,不!使用psql中的“原始数据”开关,例如“-t”或“\t”,并将查询管道传递给psql,而不是解析ASCII表格。来吧 :-)
echo 'select * from myvalue;' | psql -t -h host -U user -d db

如果您需要解析psql输出,您也可以使用-H开关(打开HTML输出),并使用一些用于解析html表格的perl模块进行解析,我曾经使用过一两次。此外,您可能希望使用pgpass文件~/.psqlrc进行一些默认设置,例如连接时的默认数据库(未指定时)。

2
就像@scott-marlowe所说,-A可以去除表格输出的对齐。为单个输出添加该标志。 - Agustín Lado

6

psql有一个-c/--command=选项,可以接受来自命令行的SQL语句,还有一个-t/--tuples-only选项,用于控制输出格式。

$ psql -c 'select 1+1'
 ?column? 
----------
        2
(1 row)
$ psql -t -c 'select 1+1'
        2

$ VALUE=`psql -t -c 'select 1+1'`
$ echo $VALUE
2

4
var=`psql -Atc "select 1;"`
echo $var
1

2

这个答案中,我解释了一种使用协同处理来与psql进行双向通信的方法。如果您只需要运行一个查询并获取单个结果,则这太过于复杂,但如果您正在使用psql进行shell脚本编写,则可能会有所帮助。


1

您可以使用psql命令过滤您获取的结果:

var=$(psql -h host -U user -d db <<SQLSTMT
SELECT * FROM myvalue;
SQLSTMT)
var=$(cut -d' ' -f3 <<<$var)

0

这些方法都对我无效,但是这个有效:

median_avm=psql "host=${dps1000} port=#### dbname=@@@ user=${reduser} password=${redpass}" -c "SELECT AVG(column) FROM db.table;" -t

使用一个包含 ${dps1000}、${reduser}、${redpass} 的源文件,并手动输入端口和数据库名。


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