【PostgreSQL】psql で CSV出力する

■ はじめに

 PostgreSQLへの更新処理に関する単体試験のエビデンスとして、
CSV出力したいなっと思って調べてみたことをメモ。

目次

案1:COPYコマンドを利用する
案2:-cオプション + SELECT文 を利用する
番外編:DBクライアントソフトを使う

■ 案1:COPYコマンドを利用する

以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2020/06/11/112650

■ 案2:-cオプション + SELECT文 を利用する

構文

psql -h [ホスト] -d [DB名] -U [ユーザー名] -c "SELECT文;" -A -F, > [CSV出力先]

psql の オプション

-A : 位置揃えなしの出力
-F [区切り文字] : 出力する際の区切り文字の指定
 => 区切り文字として「,」を指定すればCSV出力になる

サンプル

例1:psqlコマンド

psql -h localhost -d postgres -U postgres -c "SELECT * FROM person WHERE id='X0001'" -A -F, >"./results/output.csv"

例2:シェルスクリプト

#!/bin/bash

TARGET_ID=${0}

HOST="localhost"
DB_NAME="postgres"
USER="postgres"
OUTPUT_CSV="./results/output_$(date '+%Y%m%d').csv"

echo "Starting DB dump! $(date '+%Y-%m-%d %H:%M:%S')"

# Execute
psql -h ${HOST} -d ${DB_NAME} -U ${USER} -c "SELECT * FROM person WHERE id='${TARGET_ID}'" -A -F, >${OUTPUT_CSV}

echo "Done! $(date '+%Y-%m-%d %H:%M:%S')"

例3:システムカタログ pg_tables でテーブル一覧をCSV出力

#!/bin/bash

HOST="localhost"
DB_NAME="postgres"
USER="postgres"
OUTPUT_CSV="./output_$(date '+%Y%m%d').csv"

# Execute (テーブルのスキーマ名/テーブル名を出力)
psql -h ${HOST} -p ${PORT} -d ${DB_NAME} -U ${USER} -c "select schemaname, tablename from pg_tables" -A -F, >${OUTPUT_CSV}

echo "Done! $(date '+%Y-%m-%d %H:%M:%S')"

補足:システムカタログ pg_tables

* システムカタログにあるテーブルに関する情報が
 纏められているテーブル

https://www.postgresql.jp/document/8.0/html/view-pg-tables.html

参考文献

https://morinohito.site/it/command/select-csv-output

■ 番外編:DBクライアントソフトを使う

以下の関連記事の「【1】 HeidiSQL」「【2】 A5:SQL Mk-2++」などの
CSV出力機能を使用する。

DBクライアントツール
https://dk521123.hatenablog.com/entry/2016/05/08/152815

関連記事

よく使う pdqlコマンド
https://dk521123.hatenablog.com/entry/2020/01/10/224818
psql で 変数 / 定数を使う
https://dk521123.hatenablog.com/entry/2020/01/23/223756
PostgreSQLのDBをエクスポート/インポートするスクリプト
https://dk521123.hatenablog.com/entry/2018/03/02/232623
ファイルからSQL文を一括で実行するには ~pdqlコマンドの利用~
https://dk521123.hatenablog.com/entry/2014/09/11/002003
COPY コマンド ~ COPY FROM / TO ~
https://dk521123.hatenablog.com/entry/2020/06/11/112650