psqlの変更(一部だけ)

# はじめに
にゃーん
この記事は、[PostgreSQL 10全部ぬこ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/pg10-nuko-only) の9日目のエントリです。

# psqlとは
PostgreSQL使いにはお馴染み、PostgreSQLの対話的ターミナルだ。
「今どきキャラクタベースのターミナル？ねーよ」
という人もいそうだが、結構みんな使っている。ていうか自分の身の回りだとpsqlのみを使っている人の方が多い気がする。
そういえば先日のPostgreSQLカンファレンスでも、こんなやりとりがあったなあ。

![pg10-09-01.png](https://qiita-image-store.s3.amazonaws.com/0/32626/690f3969-ab78-3b86-29e4-9e5377b0fabb.png)

ということで（主に開発系の人に）人気のあるpsql。
あと、自分が作った[役に立たないスクリプト](https://github.com/nuko-yokohama/pg_scripts)の一部はpsqlを使わないとうまく表示できないし、[pg_reversi](https://github.com/nuko-yokohama/pg_reversi)はPostgreSQL 9.6のpsql機能を使ってるということで、自分にとってもpsqlは手放すことの出来ない遊び道具です。

# PostgreSQL 10の改善項目
単なる対話的ターミナルなのに、未だに改善がされているというのが面白い。
## \if, \elseif, \else, \endif
これはタイトルからも想像できるように、psql用のスクリプト内で分岐処理が行えるようになった。
この機能については、betaバージョンの頃に検証した記事（[PostgreSQL 10がやってくる！(その7) psql新機能 - \if, \elseif, \else, \endif](https://qiita.com/nuko_yokohama/items/f736454315a80fa96850)があるので、そっちを参照のこと。
（バージョン情報の説明でも簡単な例は使ってますが）

## バージョン情報
バージョン情報自体は、PostgreSQLのSQL関数や、SHOWコマンドによるPostgreSQLパラメータの参照でも取得できる。

```postgres-console
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)