職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

psql チートシート

PostgreSQLCLIのクライアント psql を仕事で使うことはそれなりに(週1回以上)ありますが、毎回叩くコマンド等を私はすぐに忘れてしまいますので、ここで cheat sheet として残しておきたいと思います。

クエリ結果表示でpagerを使わないようにする

デフォルトでは、クエリ結果の見た目行数がある程度(画面行数?)よりも多い場合、less(more?)っぽいpagerが起動しますが、オフにしたいときは \pset pager 0 です。逆にオンにするときは最後の数字を 1 で。

タイムゾーンの設定

サーバのタイムゾーンではなく、クライアント側というか、いま接続しているセッションにおけるタイムゾーンの設定です。東京にするなら SET timezone TO 'Asia/Tokyo'; で。
設定後の確認は show timezone; とか SQL select now(); あたりで。
構築して既に本番稼働してるDBサーバのタイムゾーン設定を変えるのは大変ですからね😅

クエリ結果をCSVに保存する

方法が複数あります。

  • SQLCOPY (query) to 'filepath'... 文は、PostgreSQLのサーバが稼働しているところのファイルとして保存されるものであるので、例えばAWSのRDSのような環境ではだいたい使えないでしょう。PostgreSQLのインストールしてるサーバに直接ssh等で接続して…という場合に使うはずです。
  • psql\copy (query) to 'filepath'... コマンドは、psqlが稼働している端末のローカルにファイルを保存します。マニュアルによれば、内部ではSQLCOPY (query) TO STDOUT... を叩いているようです。
  • psql起動時のオプションとして stdin とかからSQL COPY (query) TO STDOUT... を食わせて、シェルのリダイレクトで保存する方法 : スクリプトの中に組み込むのならこれが一番簡単そうに見えますが、そもそもCSVを出力する業務を自動化するのなら、それはアプリケーションサーバの機能として実装してしまうので、結局この方法を使う機会は少なそう😅

私の仕事環境では大抵はAWSのRDS上のPosgreSQLとやりとりするので、\copy コマンドのお世話になります。

\copy (select * from table_hoge limit 100) to '/tmp/test.csv' WITH DELIMITER ',' CSV HEADER QUOTE '"';