psqlで複数行のコマンドを実行する

PostgreSQLに付属のコマンドラインツールのpsqlでは、-cオプションを利用することで、データベースへの接続とコマンド実行を1つのコマンドにまとめて実行することできる。

% psql -h localhost -U postgres -c 'show shared_buffers;'
 shared_buffers 
----------------
 128MB
(1 row)

ただし、-cオプションでは1つのコマンド文字列しか指定することができない。複数のコマンドを実行しようとすると、最後のコマンドのみが実行されてしまう。

% psql -h localhost -U postgres -c 'show shared_buffers; show work_mem;'
 work_mem 
----------
 4MB
(1 row)

解決法

複数行のコマンドを実行したいときは、-cオプションではなく、EOFを利用して入力すればよい(この方法はpsqlのドキュメントにも記載されている。*1)。

 % psql -h localhost -U postgres << EOF            
heredoc> show shared_buffers;
heredoc> show work_mem;
heredoc> EOF

 shared_buffers 
----------------
 128MB
(1 row)

 work_mem 
----------
 4MB
(1 row)

もしくは、echoを使って実行したいコマンドをpsqlにパイプで渡せばよい。

% echo 'show shared_buffers; show work_mem;' | psql -h localhost -U postgres
 shared_buffers 
----------------
 128MB
(1 row)

 work_mem 
----------
 4MB
(1 row)

*1:PostgreSQL 8.4以降のドキュメントには記載がある( https://www.postgresql.org/docs/8.4/app-psql.html )。