PostgreSQLに登録されているテーブル、コメント情報を取得するには、システムカタログという情報から取得することができます。
今回は、システムカタログを使用したテーブル、テーブルに設定されているコメントをまとめて取得する方法、使用するシステムカタログの一部についての解説を紹介していきます。
検証環境
検証に使用した環境/ライブラリを次に記載します。
- PostgreSQL
- バージョン:12.4
取得方法
システムカタログを使用してテーブル一覧とテーブルのコメントを取得するためには、次のSQLを実行します。
select
pg_class.relname
, pg_description.description
from
pg_class
left outer join pg_description
on pg_class.oid = pg_description.objoid
and pg_description.objsubid = 0
取得した情報は、次になります。
pg_class.relnameは、テーブル名が取得できます。pg_description.descriptionは、テーブルのコメントが取得できます。
スキーマ情報もあわせて取得する場合は、次のSQLを実行します。
select
pg_namespace.nspname
, pg_class.relname
, pg_description.description
from
pg_class
inner join pg_namespace
on pg_class.relnamespace = pg_namespace.oid
left outer join pg_description
on pg_class.oid = pg_description.objoid
and pg_description.objsubid = 0
取得した情報は、次になります。
pg_namespace.nspnameは、スキーマの名称が取得できます。
取得するときに結合条件を使用しているのは、スキーマ、テーブル、コメントが別テーブルに登録されているためです。
pg_descriptionの取得は外部結合を指定しています。テーブルのコメントが設定されていないときでも、テーブル一覧を取得できるようにするためです。
システムカタログ
システムカタログは、スキーマ情報、テーブル、テーブルのコメント情報など、データベースやテーブルなどのさまざまな情報を保持しています。保持している情報については、次のドキュメントを参考にしてください。
ドキュメント:https://www.postgresql.jp/document/12/html/catalogs-overview.html
スキーマの取得
pg_namespaceは、名前空間(スキーマ)に関連する情報を取得できます。取得するためには、次のSQLを実行します。
select
*
from
pg_namespace
pg_namespaceで取得できる情報については、次のドキュメントを参考にしてください。
ドキュメント:https://www.postgresql.jp/document/12/html/catalog-pg-namespace.html
テーブルの取得
pg_classは、テーブル、ビュー、インデックスなどに関連する情報を取得できます。取得するためには、次のSQLを実行します。
select
*
from
pg_class
pg_classで取得できる情報については、次のドキュメントを参考にしてください。
ドキュメント:https://www.postgresql.jp/document/12/html/catalog-pg-class.html
コメントの取得
pg_descriptionは、テーブルなどの補足説明(コメント)などを取得できます。取得するためには、次のSQLを実行します。
select
*
from
pg_description
where
objsubid = 0
テーブルのコメントだけを取得する場合は、条件(where句)にobjsubid = 0を指定することで取得できます。
pg_descriptionで取得できる情報については、次のドキュメントを参考にしてください。
ドキュメント:https://www.postgresql.jp/document/12/html/catalog-pg-description.html
まとめ
PostgreSQLのシステムカタログを使用してテーブルとテーブルのコメントをまとめて取得する方法を紹介しました。
