Psqlはすべてのテーブルをリストします


125

liferayPostgreSQLインストールでデータベース内のすべてのテーブルを一覧表示したいと思います。それ、どうやったら出来るの?

データベースで実行SELECT * FROM applications;したいliferayapplications私の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=# 

回答:


203

すべてのテーブルを一覧表示する場合は、以下を使用する必要があります。

\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;

INFORMATION_SCHEMA可能な場合は、Pgシステムカタログの代わりにSQL標準の移植可能なポータブルを使用することをお勧めしますが、Pg固有の情報が必要になる場合があります。そのような場合は、システムカタログを直接クエリするのpsql -Eが適切であり、その方法についてのガイドとして役立ちます。


information_schema.tables何らかの理由でビューが含まれています。(ともかく、PostgreSQL 9.2では)
jpmc26 '17

@ jpmc26はい、でtable_type = 'VIEW'、除外するのは簡単です。一般に、SQLはビューをテーブルと同じようにできるだけ処理しようとします。
クレイグリンガー

94

データベースに接続し、テーブルをリストします。

\c liferay
\dt

それはとにかく私がそれをする方法です。

必要に応じて、これら2つのコマンドを1行に結合できます。

\c liferay \dt

2
必要な\dt *.*すべてのテーブルがにあるわけではない場合でも、実際に必要ですsearch_path
クレイグリンガー

10

あなたができる公開テーブルを見るには

リスト表

\dt

テーブル、ビュー、およびアクセス権の一覧表示

\dp or \z

または単にテーブル名

select table_name from information_schema.tables where table_schema = 'public';

2

SQLクエリでは、次のコードを記述できます。

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME';

テーブルスキームをYOUR_TABLE_SCHEMEに置き換えます。

例:

select table_name from information_schema.tables where table_schema='eLearningProject';

すべてのスキームとすべてのテーブルを表示するために、where句は必要ありません。

select table_name from information_schema.tables

1

一行の例は

\dt schemaname.* 

あなたのシナリオで

\dt public.*

0

これは、すべてのスキーマのすべてのテーブルが必要ない場合に、自動化スクリプトで使用できます。

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.