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

时间:2012-09-21 18:01:40

标签: postgresql shell

例如,我有一个表存储值:

select * from myvalue;

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

如何将此12345保存到postgresql或shell脚本中的变量中?

这是我在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 个答案:

答案 0 :(得分:12)

不,不,不!使用psql中的“原始数据”切换,如“-t”或“\ t”,并将查询传递给psql而不是解析ascii-table,来吧: - )

echo 'select * from myvalue;' | psql -t -h host -U user -d db

如果你真的需要解析psql输出,你也可以使用-H开关(打开HTML输出),并用一些perl模块解析它来解析html表,我用了一两次..另外,你可能想要默认情况下使用pgpass file~/.psqlrc,例如默认DB连接,未指定时。

答案 1 :(得分: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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

this answer中,我解释了一种方法,使用协同进程与psql来回沟通。如果您只需要运行查询并获得单个结果,那就太过分了,但如果您使用psql进行shell脚本编制可能会很有用。

答案 5 :(得分:0)

这些都不适合我,但这确实做到了:

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

使用定义了$ {dps1000},$ {reduser},$ {redpass}的源文件并手动输入端口和dbname