【问题标题】:Store PostgreSQL query result to Shell or PostgreSQL variable将 PostgreSQL 查询结果存储到 Shell 或 PostgreSQL 变量
【发布时间】:2018-08-03 04:18:46
【问题描述】:

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

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)'

【问题讨论】:

    标签: postgresql shell


    【解决方案1】:

    不,不,不!使用 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 进行一些默认设置,例如要连接的默认数据库。

    【讨论】:

    • 就像@scott-marlowe 所说,-A 删除表格输出对齐。为单个输出添加该标志。
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:
      var=`psql -Atc "select 1;"`
      echo $var
      1
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            这些都不适合我,但这确实有效:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-04-19
              • 2019-12-29
              • 1970-01-01
              • 2016-04-07
              • 1970-01-01
              • 2022-01-25
              • 1970-01-01
              相关资源
              最近更新 更多