◎ pgbashとは?
pgbashは、bashシェルにPostgreSQL用の直接SQL/埋込SQLインターフェイスを組みこんだシェルです。pgbashは、ログインシェルやサブシェル(シェルの中からシェルを起動)として、またシェルスクリプト実行用のシェルとして利用することができます。
ここで、「直接SQL」とは、SQLを入力した場合にその結果を即座に標準出力に出力する機能を表し、「埋込SQL」とは、fetch into文のように検索結果をシェル変数に代入し、シェルスクリプト言語で処理する機能を表します。
SQL文(終端子はセミコロン)は、一つのシェルコマンドとして取り扱われますので、SQL文とパイプライン/リダイレクション、バックグランドジョブ命令などを組み合わせて実行することができます。また、bashの標準機能である alias, function, 操作履歴の再利用などを使用した柔軟な対話型操作環境を提供することができます。対話型操作環境におけるSQLの実行例を次に示します。
prompt> /usr/local/bin/pgbash | --- pgbashをサブシェルとして起動 |
pgbash> connect to db2@xxx.com user sakaida; |
--- データベースdb2に接続 |
pgbash> connect to db3@yyy.com user postgres; |
--- データベースdb3に接続 |
....... |
|
pgbash> set connection db2; |
--- カレントDBをdb2にセット |
pgbash> addr='大阪' |
--- シェル変数に値を代入 |
pgbash> insert into test values( |
--- 単語の切れ目で改行可能 |
> 111,'name', |
> '$addr' |
--- シェル変数を利用 |
> ); |
|
|
pgbash> select * from test limit 100; | more |
--- パイプ出力 |
....... |
|
pgbash> select * from test; > /tmp/sel.dat & |
--- redirect + background_Job |
pgbash> cat /tmp/sel.dat |
....... |
|
pgbash> set connection db3; |
--- カレントDBをdb3にセット |
pgbash> select * from test limit 100; | more |
--- db3のtestを検索 |
....... |
|
pgbash> fc select |
--- fc でselect文の編集と再実行 |
....... |
|
pgbash> !! |
--- 直前のselect文を再実行 |
....... |
|
pgbash> disconnect all; |
--- 全てのデータベースを切断 |
pgbash> exit |
--- pgbash の終了 |
prompt> |
|
pgbashは、if文、while文などの制御文とシェル変数を用いたデータベースアクセスの為のシェルスクリプトを作成することができます。シェルスクリプトの例を次に示します。
#!/usr/local/bin/pgbash
connect to dbname2 as db2 user postgres;
begin;
declare cur cursor for select * from test;
while [ 1 ]
do
fetch in cur into :AA :AA_IND, :BB; --- 検索結果をシェル変数に代入
if [ $SQLCODE -eq $SQL_NOT_FOUND ]; then --- 検索終了の判定
break
fi
if [ $SQLCODE -eq $SQL_OK ]; then --- 検索結果が正常の判定
if [ $AA_IND -ne $SQL_NULL ]; then --- AAの値がNULLでない
echo "$AA, $BB"
fi
fi
done
end;
disconnect db2;
ここで、先頭$SQLのシェル変数は予約された変数です。
$SQLCODE --- SQLの実行状態を表すコード
$SQL_OK --- SQLの実行状態が正常の場合の値
$SQL_NOT_FOUND --- SQLの実行状態が検索終了の場合の値
$SQL_NULL --- 標識パラメータがNULLを表す場合の値
|
◎ pgbashの特徴
- pgbashは、psql と同等のデータベースアクセス機能が有ります。
- pgbashは、SQLとパイプライン、リダイレクション、バックグランドジョブとを組み合わせて実行することができます。
- pgbashは、bashの標準機能である alias、function、操作履歴の利用などの柔軟な対話型の操作環境を提供することができます。
- pgbashは、CONNECT, DISCONNECT, SET CONNECTIONを用いて、複数のデータベースを操作することができます。
- pgbashは、FETCH INTO文によって検索結果をシェル変数に代入する機能があります。
- pgbashは、データベースの内容をファイル名を指定してコピーできる独自のCOPY機能を実装しています。
- pgbashは、CGIプログラムとして実行するために、SQL出力をHTMLに切り替え、GET/POSTメソッドによるデータの読込、HTTP_COOKIE の値の読込などを自動的に行う機能があります。
- pgbashは、SQL実行後にエラーコード、エラーメッセージ、読み込みタプル数などをシェル変数にセットしてますので、SQL実行後の状態を知ることができます。
◎ 開発経緯
- 1999.07.初 : pgsql-jp メーリングリスト(ML)にてインターフェイスの検討。
- 1999.07.中 : 久保健洋さんが pqbashを作成して pgsql-jp MLで公開。
- 1999.07.末 : 直接SQL/埋込SQLのpgbashを pgsql-jp MLで検討。
- 1999.08.31 : pgbash-1.0-beta を公開。
- 1999.09.04 : pgbash-1.1の検討開始(CGI機能の追加、書式付き出力機能)
- 1999.09.06 : pgbash-1.0b2を公開(1.0-betaのバグ修正)
- 1999.09.30 : pgbash-1.1.0を公開(CGI機能の追加、出力形式の統一)
- 1999.10.01 : pgbash-1.1.1を公開(COPY命令のバグ修正と仕様変更)
- 1999.10.30 : pgbash-1.2.1を公開(操作環境の整備とCOPY文の機能追加)
- 1999.10.31 : pgbash-1.2.2 (pgbash-1.2.1のバグ修正版)
- 1999.11.22 : pgbash-1.2.3を公開(SQLOIDシェル変数の追加)
- 1999.12.25 : pgbash-2.0を公開 (bash-2.03本体を修正してSQL実行機能を追加)
- 2000.01.07 : pgbash-2.0.1を公開(MB関数リンク、システムメッセージ出力制御追加)
- 2000.05.16 :
pgbash-2.1 を公開
(PostgreSQL v6.5.xとv7.0.xの両方に対応)
(謝辞)
pgbashは、久保健洋(kubo-t@cx.airnet.ne.jp)さんの orabash/pqbash (Oracle/PostgreSQL用bash組込コマンド)のアイデアをもとにして開発されました。また、pgbashの検討に際して、pgsql-jpメーリングリストの皆様から貴重なご意見を頂きました。ここに、改めてpgbashに協力していただきました皆様に感謝したいと思います。
◎ 関連ページ
|