はじめに
にゃーん。趣味でポスグレをやっている者だ。
この記事はPostgreSQL 16 全部ぬこ Advent Calendar 2022 13日目の記事です。
今回はpsqlに追加されたメタコマンドについて書いてみます。
概要
項目 | 内容 |
---|---|
タイトル | psql: Add command to use extended query protocol |
Topic | Clients |
ステータス | commited |
Last Modified | 2022-11-15 |
概要 | psqlユーティリティのメタコマンド\bind の追加 |
変更内容
今回の改造はpsql
のメタコマンド\g
に関連します。
が、この\g
メタコマンド自体、使ったことがない人もいるかもしれないので、そこからまず説明します。
\g コマンドって何?
psql
ユーティリティには、いろいろなメタコマンド(psqlコマンドという言い方もする)があります。
\g
コマンドはpsql
内で直前に実行したコマンドを再実行するというものです。
=# SELECT now();
now
-------------------------------
2022-12-07 16:23:46.909565+09
(1 row)
=# \g
now
-------------------------------
2022-12-07 16:23:49.628548+09
(1 row)
=#
似たような動作をするメタコマンドとして\watch
というコマンドがあります。これは直前に実行したコマンドを繰り返し実行します。
=# \watch
Wed 07 Dec 2022 04:24:59 PM JST (every 2s)
now
------------------------------
2022-12-07 16:24:59.21176+09
(1 row)
Wed 07 Dec 2022 04:25:01 PM JST (every 2s)
now
-------------------------------
2022-12-07 16:25:01.211875+09
(1 row)
Wed 07 Dec 2022 04:25:03 PM JST (every 2s)
now
-------------------------------
2022-12-07 16:25:03.211945+09
(1 row)
^C
=#
ただ、これまで\g
コマンドでは、引数を渡し、その引数に応じたコマンドを実行することはできませんでした。
PostgreSQL 16での改善
PostgreSQL 16からは、\g
メタコマンドに\bind
というメタコマンドが追加され、引数を可変にして、直前のコマンドを実行できるようになりました。
最初に\bind
メタコマンドを使って2つの引数を設定します。
そして、SQLコマンドに$1
,$2
といったバインド変数を書いて実行します。
# \bind 1 'ABC'
=# SELECT $1, now(), $2;
?column? | now | ?column?
----------+------------------------------+----------
1 | 2022-12-07 16:55:20.27155+09 | ABC
(1 row)
=#
$1
, $2
に\bind
メタコマンドで指定したパラメータが設定されて実行されました。
この状態で同じように、\bind
メタコマンドで新しい2つのパラメータを設定し、\g
メタコマンドを実行します。
=# \bind 3 'XYZ'
=# \g
?column? | now | ?column?
----------+-------------------------------+----------
3 | 2022-12-07 16:55:28.416598+09 | XYZ
(1 row)
=#
直前のパラメータ付きのSQL文が、新たに与えたパラメータで実行されました。
PostgreSQL 15では\bind
メタコマンドが存在しないのでpsql
エラーになります。
=# \bind 1 'ABC'
invalid command \bind
Try \? for help.
=#
余談
このCommitfestのタイトルは、psql: Add command to use extended query protocol なんですが、拡張プロトコル云々の話ではなく、\bind
メタコマンドの追加、という話になったようです。自分がきちんと議論を追えてない(というか追うのが面倒になった)ので、拡張プロトコルの話がどうなったのかは不明・・・。
おわりに
今回はpsql
ユーティリティに追加された、メタコマンドについて書いてみました。
psql
ユーティリティもバージョンアップ毎に地味に進化していますね。全機能を使いこなすのはなかなか難しいですが・・・。
さて、全部ぬこアドベントカレンダー、やっと折り返し地点に来ました。
しかし、この記事を書いている時点で、もうネタの弾切れ感があります。後半戦どうなるのか・・・。