LoginSignup
2
0

More than 1 year has passed since last update.

PG16:psql: Add command to use extended query protocol

Last updated at Posted at 2022-12-12

はじめに

にゃーん。趣味でポスグレをやっている者だ。

この記事は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ユーティリティもバージョンアップ毎に地味に進化していますね。全機能を使いこなすのはなかなか難しいですが・・・。


さて、全部ぬこアドベントカレンダー、やっと折り返し地点に来ました。
しかし、この記事を書いている時点で、もうネタの弾切れ感があります。後半戦どうなるのか・・・。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0