psqlはデフォルトで若干の変数が設定されており、起動直後から\setコマンドで分かります。接続先DBやポートを知るのに便利。ただし変数VERSIONは接続先DBでなくpsql自体の。DBのバージョンを知るにはクエリが必要なので、この際、最初から両方を変数に入れてみます。psqlの初期設定と変数を使う簡単な例を兼ねて。
↓ 変数VERSIONと、DBのバージョンが異なる例。psqlがWindowsネイティブ、サーバがCygwin版。自分は逆のパターンが最近多いけど。
> psql -U postgres -p 5952
psql (9.5.3, サーバー 9.5.2)
"help" でヘルプを表示します.
postgres=# \set
AUTOCOMMIT = 'on'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
VERBOSITY = 'default'
VERSION = 'PostgreSQL 9.5.3, compiled by Visual C++ build 1800, 64-bit'
DBNAME = 'postgres'
USER = 'postgres'
HOST = 'localhost'
PORT = '5952'
ENCODING = 'SJIS'
postgres=# select version();
version
--------------------------------------------------------------------------------
PostgreSQL 9.5.2 on x86_64-unknown-cygwin, compiled by gcc (GCC) 5.3.0, 64-bit
(1 行)
psqlのVERSION変数はコンパイル時にPG_VERSION_STRがセットされ(startup.cの166行目あたり)、サーバなど他のプログラムと共通のようです。詳細は下記参照。
» Postgres 9.4 feature highlight - extra string version in configure
"PG_VERSION_STR and PG_VERSION are used to reference the version number of all the binaries launched with –version."
↓ 実行ファイルをバイナリエディタ(Stirling)で開くと、確かにVERSION変数が文字列で入ってます。VC版psql.exe、Cygwin版psql.exeの順。
本題。1月3日にも書いたけど、psqlは起動時に設定ファイルを読み込みます。そのデフォルトパスがWindowsでは%APPDATA%\postgresql\psqlrc.conf、Linux等では~/.psqlrc。環境変数PSQLRCがあれば設定ファイルパスと見なすので(ファイル名は何でもいい)自由度が高いです。
今回はWindowsでネイティブのpsqlを例に。とりあえず適当な場所に ↓ こんな設定ファイルを置きます。変数名(cver, sver)はお好みで。
-- r:\.psqlrc
\set cver :VERSION
\unset VERSION
select version() as sver \gset
まず既存の変数VERSIONを別の変数にコピー。続いてVERSIONは削除。最後にDBのバージョンを得るクエリを\gsetで実行。クエリでの列名が変数名になります。
↓ 結果の確認。一時的に環境変数PSQLRCを設定してからpsqlを起動し、\setコマンドで変数一覧を出します(表示は設定された順)。
-- on Command Prompt
> set PSQLRC=r:\.psqlrc
> psql ...
psql (9.5.3, サーバー 9.5.2)
"help" でヘルプを表示します.
postgres=# \set
AUTOCOMMIT = 'on'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
VERBOSITY = 'default'
DBNAME = 'postgres'
USER = 'postgres'
HOST = 'localhost'
PORT = '5952'
ENCODING = 'SJIS'
cver = 'PostgreSQL 9.5.3, compiled by Visual C++ build 1800, 64-bit'
sver = 'PostgreSQL 9.5.2 on x86_64-unknown-cygwin, compiled by gcc (GCC) 5.3.0, 64-bit'
変数の中身は「\echo :変数名」で見れますが、今回は\setの方が楽。