スクリーンショット_2019-08-26_15

PostgreSQLに接続するときに使える小技


psqlからRDSなんかに接続しようとすると、

psql -h service-prod.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U username mydb

みたいな感じのオプションを渡すのが普通ですが、ホスト名が長くて、自分が意図した接続先かどうか瞬時に判別できなくてお困りではないですか?

pg_service.confを定義することで、接続先をシンプルに指定することができます。

$ psql service=prod

$ psql service=dev

$HOME/.pg_service.confの内容は以下のようになります。

[prod]
host=service-prod.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
user=username
dbname=mydb

[dev]
host=service-dev.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
user=username
dbname=mydb

解説

pg_service.conf

pg_service.confは接続サービスファイルと呼ばれるINI形式の設定ファイルです。接続時のパラメータをサービス名にひもづけることができます。

34.16. 接続サービスファイル | PostgreSQL 11.4文書

ホスト名やユーザー名の他にも様々なオプションを指定することができます。たとえばapplication_nameに任意の名前を指定することにより、pg_stat_activityビューやログファイル上で該当の接続を識別することができるようになります。

[prod]
host=service-prod.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com
user=username
dbname=mydb
application_name=myApp

34.1.2. パラメータキーワード | PostgreSQL 11.4文書

さらにパスワードを書いておくこともできますが、専用のpgpassファイルに書く方が一般的です。

34.15. パスワードファイル | PostgreSQL 11.4文書

psqlの接続先の指定方法

pg_service.confを使うことで接続パラメータに名前をつけることができるのはわかりましたが、その名前をpsqlの起動時にどのように指定すれば良いのでしょうか。psqlのヘルプにはそのようなオプションはありません。

$ psql --help
psql is the PostgreSQL interactive terminal.

Usage:
 psql [OPTION]... [DBNAME [USERNAME]]

General options:
 -c, --command=COMMAND    run only single command (SQL or internal) and exit
 -d, --dbname=DBNAME      database name to connect to (default: "user")
 -f, --file=FILENAME      execute commands from file, then exit
 -l, --list               list available databases, then exit
 -v, --set=, --variable=NAME=VALUE
...

実はpsqlのドキュメントには接続先の指定方法について、コマンドラインオプションの他にconninfoとURIという方法があると書かれています。冒頭の例で使ったservice=prodのはこのconninfo形式をつかってpg_service.conf内で定義したサービス名指定するものです。

他の接続パラメータの指定方法としてconninfo文字列またはURIがあります。 これは、データベース名の代わりに使用されます。 この機構により、接続全体に関する非常に幅広い制御を行うことができます。 以下に例を示します。
$ psql "service=myservice sslmode=require"
$ psql postgresql://dbmaster:5433/mydb?sslmode=require

データベースへの接続 | PostgreSQL 11.4文書

conninfo文字列とURIとは、クライアントライブラリであるlibpqが接続時に使う文字列のことです。これらを使うことにより、普通のコマンドラインオプションでは指定することができない様々な設定値を接続時に指定することができます。

34.1.1. 接続文字列 | PostgreSQL 11.4文書

34.1.2. パラメータキーワード | PostgreSQL 11.4文書

ちなみにこのpg_service.confという機能は、少なくとも2003年には既に存在していて、psqlの引数からこれを使えるようになったのは2008年にリリースされたバージョン8.3からのようです。私もpg_service.confの存在は10年以上前から存在は知っていましたが、psqlの引数から使うことができるというのは最近知りました。

まとめ

pg_service.confを定義することにより、psqlの接続先をわかりやすく指定する方法について説明しました。また、pg_service.confやpgpassを参照する機能はlibpqで実装されているため、psql以外のlibpqを使った接続方法でも同じように使うことができます。

他にもpsqlを使うときに環境変数PGUSERなどを使われている方も多いかと思いますが、これも実際にはpsqlの機能ではなく、libpqの機能です。このため、例えばRubyで書いたプログラムからPostgreSQLに接続するときは、ruby-pgがlibpqを使っているため、同じことができます。

libpqのドキュメントはC言語でプログラムを書く人以外には関係ないと思われがちですが、実際にはpsqlをはじめlibpqを使ってPostgreSQLにアクセスする全ての人にとって役に立つ情報が隠されているので、ぜひ一度目を通してみることをお勧めします。

第34章 libpq - C ライブラリ| PostgreSQL 11.4文書

この記事が気に入ったらサポートをしてみませんか?