\dvコマンドでビュー一覧を確認する

PostgreSQLでビュー一覧を確認するには、psqlコマンドラインツールの\dvコマンドを使う。

testdb=# \dv
          List of relations
 Schema |    Name     | Type | Owner
--------+-------------+------+-------
 public | user_orders | view | postgres
(1 row)

\dvは自分で作成したスキーマとpublicスキーマのビューだけを表示し、pg_catalogなどのシステムスキーマは除外される。

\dv+で所有者・サイズ・コメントも表示する

+を付けると永続性・サイズ・コメントの列が追加される。

testdb=# \dv+
                             List of relations
 Schema |    Name     | Type | Owner | Persistence |  Size   | Description
--------+-------------+------+-------+-------------+---------+-------------
 public | user_orders | view | postgres   | permanent   | 0 bytes |
(1 row)

ビューは実体データを持たないため、Size列は常に0 bytesになる。

名前で絞り込む

\dvの後ろにパターンを指定すると、特定のスキーマや名前のビューだけに絞り込める。

testdb=# \dv app.*
          List of relations
 Schema |    Name     | Type | Owner
--------+-------------+------+-------
 app    | user_orders | view | postgres
(1 row)

パターンを指定した場合はシステムスキーマも検索対象に含まれる。

\dとの違い

引数なしの\dはテーブル・ビュー・シーケンス・マテリアライズドビューなど、あらゆる種類のリレーションをまとめて表示する。

testdb=# \d
                 List of relations
 Schema |     Name      |       Type        | Owner
--------+---------------+-------------------+-------
 public | docs          | table             | postgres
 public | docs_id_seq   | sequence          | postgres
 public | events        | partitioned table | postgres
 public | events_2026   | table             | postgres
 public | invoice_seq   | sequence          | postgres
 public | order_summary | materialized view | postgres
 public | orders        | table             | postgres
 public | orders_id_seq | sequence          | postgres
 public | user_orders   | view              | postgres
 public | users         | table             | postgres
 public | users_id_seq  | sequence          | postgres
(11 rows)

ビューだけに絞り込みたい場合は\dvを使う。

参考: 【PostgreSQL】SQLでテーブル一覧を取得する

information_schema.viewsでビュー一覧を確認する

SQLでビュー一覧を取得する場合はinformation_schema.viewsビューを参照する。

testdb=# SELECT table_schema, table_name
testdb-# FROM information_schema.views
testdb-# WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
testdb-# ORDER BY table_schema, table_name;
 table_schema | table_name
--------------+-------------
 app          | user_orders
 public       | user_orders
(2 rows)

information_schema.viewsにはビューの定義そのものを取得できるview_definition列もある。

testdb=# SELECT view_definition
testdb-# FROM information_schema.views
testdb-# WHERE table_schema = 'public' AND table_name = 'user_orders';
               view_definition
----------------------------------------------
  SELECT u.name,                             +
     o.amount                                +
    FROM (users u                            +
      JOIN orders o ON ((u.id = o.user_id)));
(1 row)

同じテーブル名のビューが複数スキーマに存在する場合があるため、table_nameだけでなくtable_schemaも条件に含めて1件に絞り込む。

pg_classでビュー一覧を確認する

information_schema.viewsは権限に応じて見える範囲が絞られる。権限に関係なくすべてのビューを取得したい場合はpg_classrelkind = 'v'で絞り込む。

testdb=# SELECT n.nspname, c.relname
testdb-# FROM pg_class c
testdb-# JOIN pg_namespace n ON n.oid = c.relnamespace
testdb-# WHERE c.relkind = 'v'
testdb-# AND n.nspname NOT IN ('pg_catalog', 'information_schema')
testdb-# ORDER BY 1, 2;
 nspname |   relname
---------+-------------
 app     | user_orders
 public  | user_orders
(2 rows)

relkindvがビュー、mがマテリアライズドビュー、rが通常のテーブルを表す。psqlの\dvも内部的にはこのpg_classを参照している。

参考: 【PostgreSQL】スキーマ一覧を確認する

マテリアライズドビューは含まれない

\dvinformation_schema.viewspg_class(relkind = 'v')のいずれも、マテリアライズドビュー(relkind = 'm')は含まない。マテリアライズドビュー一覧を確認する場合は\dmを使う。

testdb=# \dm
                 List of relations
 Schema |     Name      |       Type        | Owner
--------+---------------+-------------------+-------
 public | order_summary | materialized view | postgres
(1 row)

見た目は似ているが、CREATE VIEWで作る通常のビューとCREATE MATERIALIZED VIEWで作るマテリアライズドビューは別の種類のオブジェクトとして扱われる。

参考