はじめに
にゃーん
この記事は、PostgreSQL 10全部ぬこ Advent Calendar 2017 の9日目のエントリです。
psqlとは
PostgreSQL使いにはお馴染み、PostgreSQLの対話的ターミナルだ。
「今どきキャラクタベースのターミナル?ねーよ」
という人もいそうだが、結構みんな使っている。ていうか自分の身の回りだとpsqlのみを使っている人の方が多い気がする。
そういえば先日のPostgreSQLカンファレンスでも、こんなやりとりがあったなあ。
ということで(主に開発系の人に)人気のあるpsql。
あと、自分が作った役に立たないスクリプトの一部はpsqlを使わないとうまく表示できないし、pg_reversiはPostgreSQL 9.6のpsql機能を使ってるということで、自分にとってもpsqlは手放すことの出来ない遊び道具です。
PostgreSQL 10の改善項目
単なる対話的ターミナルなのに、未だに改善がされているというのが面白い。
\if, \elseif, \else, \endif
これはタイトルからも想像できるように、psql用のスクリプト内で分岐処理が行えるようになった。
この機能については、betaバージョンの頃に検証した記事(PostgreSQL 10がやってくる!(その7) psql新機能 - \if, \elseif, \else, \endifがあるので、そっちを参照のこと。
(バージョン情報の説明でも簡単な例は使ってますが)
バージョン情報
バージョン情報自体は、PostgreSQLのSQL関数や、SHOWコマンドによるPostgreSQLパラメータの参照でも取得できる。
postgres=# SELECT version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 10.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-bit
(1 row)
postgres=# SHOW server_version ;
server_version
----------------
10.0
(1 row)
postgres=# SHOW server_version_num;
server_version_num
--------------------
100000
(1 row)
PostgreSQL 10からは、psqlのメタコマンド機能でも取得できるようになった。
[nuko@localhost psql]$ more version.sql
\echo Server version is :SERVER_VERSION_NAME
SELECT (setting = '10.0') as v FROM pg_settings WHERE name = 'server_version'
\gset
\if :v
\echo Script for PostgreSQL 10
\else
\echo Script for PostgreSQL < 10
\endif
このスクリプトをPostgreSQL 9.6.5(port=5433)に対して実行した場合。
[nuko@localhost psql]$ psql -U postgres -p 5433 -f version.sql
Server version is 9.6.5
Script for PostgreSQL < 10
このスクリプトをPostgreSQL 10.0(port=5432)に対して実行した場合。
[nuko@localhost psql]$ psql -U postgres -p 5432 -f version.sql
Server version is 10.0
Script for PostgreSQL 10
\gxメタコマンド
psqlには\x
という拡張表示形式を指定するコマンドがある。
この\gx
メタコマンドは、\x
の表示形式に対応したものらしいが、正直、良くわからぬ・・・
\dコマンドの出力項目の追加
テーブルの一覧や、指定したテーブルの列情報を表示する\d
メタコマンドの出力項目が追加された。追加されたのはcollaion, nullable, defaultの3列の情報だ。
9.6までの表示の例
[nuko@localhost psql]$ ~/pgsql/pgsql-9.6/bin/psql -p 5433 -U postgres
psql (9.6.5)
Type "help" for help.
postgres=# \d pg_database
Table "pg_catalog.pg_database"
Column | Type | Modifiers
---------------+-----------+-----------
datname | name | not null
datdba | oid | not null
encoding | integer | not null
datcollate | name | not null
datctype | name | not null
datistemplate | boolean | not null
datallowconn | boolean | not null
datconnlimit | integer | not null
datlastsysoid | oid | not null
datfrozenxid | xid | not null
datminmxid | xid | not null
dattablespace | oid | not null
datacl | aclitem[] |
Indexes:
"pg_database_datname_index" UNIQUE, btree (datname), tablespace "pg_global"
"pg_database_oid_index" UNIQUE, btree (oid), tablespace "pg_global"
Tablespace: "pg_global"
postgres=#
10.1での表示例
[nuko@localhost psql]$ psql -p 5432 -U postgres
psql (10.0)
Type "help" for help.
postgres=# \d pg_database
Table "pg_catalog.pg_database"
Column | Type | Collation | Nullable | Default
---------------+-----------+-----------+----------+---------
datname | name | | not null |
datdba | oid | | not null |
encoding | integer | | not null |
datcollate | name | | not null |
datctype | name | | not null |
datistemplate | boolean | | not null |
datallowconn | boolean | | not null |
datconnlimit | integer | | not null |
datlastsysoid | oid | | not null |
datfrozenxid | xid | | not null |
datminmxid | xid | | not null |
dattablespace | oid | | not null |
datacl | aclitem[] | | |
Indexes:
"pg_database_datname_index" UNIQUE, btree (datname), tablespace "pg_global"
"pg_database_oid_index" UNIQUE, btree (oid), tablespace "pg_global"
Tablespace: "pg_global"
おわりに
今回はpsql改善のうち、わかりやすそうなもののみを取り上げた。正直、自分にもまだ全ての改善項目が理解しきれているわけではないが・・・
参考:該当するリリースノート
本エントリに関連するPostgreSQL 10リリースノートの記載です。
E.2.3.9.1. psql
Add conditional branch support to psql (Corey Huinker)
Add psql \gx meta-command to execute (\g) a query in expanded mode (\x) > (Christoph Berg)
Expand psql variable references in backtick-executed strings (Tom Lane)
Prevent psql's special variables from being set to invalid values (Daniel Vérité, Tom Lane)
Add variables showing server version and psql version (Fabien Coelho)
Improve psql's \d (display relation) and \dD (display domain) commands to > show collation, nullable, and default properties in separate columns (Peter Eisentraut)
Make the various \d commands handle no-matching-object cases more consistently (Daniel Gustafsson)
Improve psql's tab completion (Jeff Janes, Ian Barwick, Andreas Karlsson, Sehrope Sarkuni, Thomas Munro, Kevin Grittner, Dagfinn Ilmari Mannsåker)