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

Roc*_*ock 7 postgresql shell

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

select * from myvalue;

  val
-------
 12345
(1 row)
Run Code Online (Sandbox Code Playgroud)

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

这是我在shell脚本中尝试的内容:

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

但是echo $var给了我:

val ------- 12345 (1 row)
Run Code Online (Sandbox Code Playgroud)

我也试过了

\set var (select * from myvalue)
Run Code Online (Sandbox Code Playgroud)

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

var = '(select*frommyvalue)'
Run Code Online (Sandbox Code Playgroud)

Pio*_*das 12

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

echo 'select * from myvalue;' | psql -t -h host -U user -d db
Run Code Online (Sandbox Code Playgroud)

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

  • 就像@ scott-marlowe所说的那样,-A删除了表输出对齐.为单个输出添加该标志. (2认同)

wil*_*ynn 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
Run Code Online (Sandbox Code Playgroud)