1. ホーム
  2. postgresql

[解決済み] Psqlの全テーブルのリスト

2022-06-18 14:48:20

質問

のテーブルをすべてリストアップしたいのですが、どうすればよいでしょうか。 liferay データベースのすべてのテーブルをリストアップしたいです。どのようにすればよいのでしょうか?

私は実行したいです SELECT * FROM applications; の中で liferay データベースを使用します。 applications は私のliferay dbのテーブルです。これはどのように行われるのでしょうか?

これは私のすべてのデータベースのリストです。

postgres=# \list
                              List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
 -----------+----------+----------+-------------+-------------+-----------------------
 liferay   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | liferay=CTc/postgres
 lportal   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 postgres  | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 template0 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=# 

どのように解決するのですか?

リストアップする場合 すべて テーブルを使用する必要があります。

\dt *.*

を使えば、すべてのテーブルを をすべてのスキーマで . これには pg_catalog にあるテーブル、システムテーブル、そして information_schema . すべてのユーザ定義スキーマのすべてのテーブルを指定するビルトインの方法はありません。 search_path を実行する前に、対象となる全てのスキーマのリストに設定することができます。 \dt .

これをプログラム的に行いたい場合もあるでしょうが、その場合は psql のバックスラッシュ・コマンドではうまくいきません。この場合 INFORMATION_SCHEMA が助けに来てくれる。テーブルをリストアップするために

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

ちなみに、もしあなたが psql がバックスラッシュコマンドに応答して何をしているかを見たい場合は、次のように実行します。 psql を実行すると -E フラグを使います。

$ psql -E regress    
regress=# \list
********* QUERY **********
SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
       pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************

ということで psql が検索しているのは pg_catalog.pg_database を検索しています。同様に、与えられたデータベース内のテーブルについても

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;

標準SQLで、移植性の高い INFORMATION_SCHEMA を使用することが望ましいのですが、時には Pg 固有の情報が必要な場合があります。そのような場合は システムカタログ を直接問い合わせても問題ありませんし psql -E はそうする方法の有用なガイドとなりえます。