例如,我有一个表存储值:
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)'
答案 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