テンプレートデータベースとは
 データベースを新規で作成するときに、ひな型となるデータベースのことです。
 例えば、もしテンプレートデータベースtemplate_experiment_databaseにtemplate_experimentテーブルがあれば、そのテンプレートデータベースをもとに新規で作成したデータベースexperimetn_databaseにもtemplate_experimentテーブルが作成されています。
テンプレートデータベースの使い方
(1)テンプレートデータベースを使って新規のデータベースを作成する方法、(2)テンプレートデータベースを作成する方法、(3)テンプレートデータベースを削除する方法を紹介します。
(1)テンプレートデータベースを使ってデータベースを作成する
テンプレートデータベースtemplate_experiment_databaseを使って、新規のデータベースexperiment_databaseを作成してみましょう。以下の二つの方法で作成することができます。ちなみに、何もテンプレートデータベースを指定せずにデータベースを作成した場合、デフォルトのテンプレートデータベースtemplate1が勝手にテンプレートデータベースとなっています。
(1)createdbで-Tオプションを使う
書き方:createdb 新規データベース名 -T テンプレートデータベース名
$ createdb experiment_database -T template_experiment_database
(2)CREATE DATABASEでTEMPLATEを使う
書き方:CREATE DATABASE 新規データベース名 TEMPLATE テンプレートデータベース名;
postgres=# create database experiment_database template template_experiment_database;
CREATE DATABASE
(2)テンプレートデータベースを作成する
テンプレートデータベースは以下のようにして自分で作成することができます。
書き方:CREATE DATABASE テンプレートデータベース名 IS_TEMPLATE true;
postgres=# create database template_experiment_database is_template true;
CREATE DATABASE
既存のデータベースをテンプレートデータベースにすることもできます。ALTER DATABASEを使用します。
書き方:ALTER DATABASE テンプレートデータベース名 IS_TEMPLATE true;
postgres=# alter database template_experiment_database is_template true;
ALTER DATABASE
ちなみに、テンプレートデータベースでなくする場合にはIS_TEMPLATE falseとします。
(3)テンプレートデータベースの削除
 テンプレートデータベースはdropdbしても削除することはできません。まず、**ALTER DATABASE~IS_TEMPLATE false;**でテンプレートデータベースから普通のデータベースに変更します(pg_database.datistemplateがfalseになる)。そのあとにdropdbを実行します。ただし、template0は削除することができません。
 ちなみにシステムカタログのpg_databaseはテーブルであるためUPDATEで変更することも可能ですが、システムカタログを直接変更してはいけません(マニュアルのシステムカタログを参照)。
$ dropdb template_experiment_database       --テンプレートデータベースであるため削除できない
2019-11-06 06:27:35.644 JST [4674] ERROR:  cannot drop a template database
2019-11-06 06:27:35.644 JST [4674] STATEMENT:  DROP DATABASE template_experiment             _database;
dropdb: error: database removal failed: ERROR:  cannot drop a template database
$ psql template_experiment_database         
template_experiment_database=# select * from pg_database;   --datistemplateがtrueになっていることを確認しているだけ
-[ RECORD 4 ]-+------------------------------
oid           | 65600
datname       | template_experiment_database
datdba        | 10
encoding      | 6
datcollate    | ja_JP.UTF-8
datctype      | ja_JP.UTF-8
datistemplate | t
datallowconn  | t
datconnlimit  | -1
datlastsysoid | 13592
datfrozenxid  | 479
datminmxid    | 1
dattablespace | 1663
datacl        |
template_experiment_database=# alter database template_experiment_database is_template false;                 --テンプレートデータベースから普通のデータベースに変更する
ALTER DATABASE
template_experiment_database=# select * from pg_database;   --datistemplateがfalseになっているかを確認
-[ RECORD 6 ]-+------------------------------
oid           | 65600
datname       | template_experiment_database
datdba        | 10
encoding      | 6
datcollate    | ja_JP.UTF-8
datctype      | ja_JP.UTF-8
datistemplate | f
datallowconn  | t
datconnlimit  | -1
datlastsysoid | 13592
datfrozenxid  | 479
datminmxid    | 1
dattablespace | 1663
datacl        |
template_experiment_database=# \q                          --template_experiment_databaseに接続したままだと削除できないため
$ dropdb template_experiment_database                      --template_experiment_databaseを削除
まとめ
 新規のデータベースを作成するときには、-TオプションやTEMPLATEでテンプレートデータベースを指定することができました。
 テンプレートデータベースを作成するときにはIS_TEMPLATEをtrueに、削除するときにはIS_TEMPLATEをfalseにすることが必要です。
 最後までお読みいただき、ありがとうございました。
参考
PostgreSQLマニュアル「テンプレートデータベース」
https://www.postgresql.jp/document/11/html/manage-ag-templatedbs.html
PostgreSQLマニュアル「システムカタログ」
https://www.postgresql.jp/document/11/html/catalogs.html