シェルスクリプトで PostgreSQL の SQL 実行結果を1行づつ処理する



シェルスクリプトで SQL の結果を1行づつ処理する

シェルスクリプトで PostgreSQL の SQL 実行結果を1行づつ処理する場合どのようにシェルスクリプトを組めばよいのか説明していきます。




1行づつ処理したい SQL とその実行結果を確認

まず最初に1行づつ処理したい SQL とその実行結果を確認しましょう。

ここでは pg_tables というテーブルから得られる PostgreSQL のシステムテーブル一覧を 1行づつシェルスクリプトで処理する場合で説明します。

以下は今回1行づつ処理したい SQL とその実行結果です。
=> 
SELECT
  schemaname,
  tablename
FROM pg_tables
WHERE schemaname = 'pg_catalog'
ORDER BY schemaname, tablename
LIMIT 10;

------------+-----------------
 schemaname |    tablename
------------+-----------------
 pg_catalog | pg_aggregate
 pg_catalog | pg_am
 pg_catalog | pg_amop
 pg_catalog | pg_amproc
 pg_catalog | pg_attrdef
 pg_catalog | pg_attribute
 pg_catalog | pg_auth_members
 pg_catalog | pg_authid
 pg_catalog | pg_cast
 pg_catalog | pg_class
------------+-----------------
(10 rows)

シェルスクリプトの作成

ここでは test.sh というシェルスクリプトを以下の内容で作成します。
#!/bin/bash

SQL=$(cat << EOD
SELECT
  schemaname,
  tablename
FROM pg_tables
WHERE schemaname = 'pg_catalog'
ORDER BY
  schemaname,
  tablename
LIMIT 10
EOD
)

echo ${SQL} | psql \
  -h 127.0.0.1 \
  -p 5432 \
  -d hoge \
  -U postgres \
  --no-align \
  -t \
  --field-separator '|' \
  -q \
| while IFS='|' read schemaname tablename ; do

cat <<EOD
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : ${schemaname}
tablename  : ${tablename}
EOD

done

SQL 実行結果をパイプ(|)でシェルのループ処理に渡してあげて、その結果をシェルスクリプト内で1行ずつ処理するというものになります。

シェルスクリプを実行

では早速作成した test.sh スクリプトを実行してみましょう。結果は次のようになります。
$ chmod 744 ./test.sh
$ ./test.sh
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_statistic
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_type
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_attribute
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_authid
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_proc
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_class
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_user_mapping
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_constraint
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_inherits
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[Table Information]
schemaname : pg_catalog
tablename  : pg_index

このスクリプトを改変することでいろんなフォーマットでデータを1行づつ表示したり加工したりすることが出来るようになります。

cron 経由でのレポートも簡単に作成できますね。