如何使用bash shell中的psql命令执行多个查询?

Pan*_*yal 35 database postgresql shell

我需要使用psql -c命令从命令行执行postgresql查询.对于每个psql命令,它会打开一个新的tcp连接以连接到数据库服务器并执行查询,这是大量查询的开销.

目前我可以像这样执行单个查询:

psql -U postgres -h <ip_addr> -c "SELECT * FROM xyz_table;"
Run Code Online (Sandbox Code Playgroud)

当我尝试执行如下的多个查询,但只执行了最后一个查询.

psql -U postgres -h <ip_addr> -c "SELECT * FROM xyz_table; SELECT * FROM abc_table;"
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我并告诉我正确的方法吗?

kel*_*tar 61

-c只处理一个命令.没有它,但是psql期望命令被传递到标准输入,例如:

psql -U postgres -h <ip_addr> <database_name> << EOF
SELECT * FROM xyz_table;
SELECT * FROM abc_table;
EOF
Run Code Online (Sandbox Code Playgroud)

或者通过使用echo和管道.

  • 当前版本的 psql 允许使用多个“-c”命令。 (3认同)
  • 我还阅读了关于 `psql -U postgres -h &lt;ip_addr&gt; &lt;database_name&gt; -f -` 来做同样的事情。有什么优点或缺点吗? (2认同)
  • 正如问题注释中的通配符所指出的,使用 -c &lt;command&gt; 执行实际上会执行所有语句,但只会返回最后一条的结果。 (2认同)

Sal*_*ami 8

使用echo和管道将它装在一条线上:

echo 'SELECT * FROM xyz_table; \n SELECT * FROM abc_table' | psql -U postgres 
Run Code Online (Sandbox Code Playgroud)

  • 在某些系统上,您可能需要执行`echo -e ...` (3认同)

Clo*_*eto 7

--file参数执行文件的内容

psql -U postgres -h <ip_addr> -f "my_file.psql"
Run Code Online (Sandbox Code Playgroud)

所有输出都将发送到标准输出

http://www.postgresql.org/docs/current/static/app-psql.html


Cyr*_*amm 5

至少从9.6.2起,此方法也有效:

psql -c“选择现在()” -c“选择版本()” -U postgres -h 127.0.0.1

现在

2017-12-26 20:25:45.874935 + 01(1行)

x86_64-pc-linux-gnu上的PostgreSQL 9.6.2,由gcc编译(Ubuntu 5.3.1-14ubuntu2)5.3.1 20160413,64位(1行)