web-dev-qa-db-ja.com

Psqlはすべてのテーブルを一覧表示します

私のPostgreSQLインストールのliferayデータベースにある全てのテーブルをリストしたいです。それ、どうやったら出来るの?

liferayデータベースでSELECT * FROM applications;を実行したいです。 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=# 
119
pethel

allテーブルを一覧表示したい場合は、次のものを使用する必要があります。

\dt *.*

すべてのテーブルが欲しいことを示すためにすべてのスキーマで。これにはpg_catalog内のテーブル、システムテーブル、そしてinformation_schema内のテーブルが含まれます。 「すべてのユーザー定義スキーマ内のすべてのテーブル」と言うための組み込みの方法はありません。ただし、search_pathを実行する前に、\dtを対象となるすべてのスキーマのリストに設定することはできます。

プログラム的にこれを行うことをお勧めしますが、その場合はpsqlバックスラッシュコマンドではうまくいきません。これが INFORMATION_SCHEMA が助けになるところです。テーブルを一覧表示するには

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

ところで、バックスラッシュコマンドに対してpsqlが何をしているのかを知りたい場合は、-Eフラグを付けてpsqlを実行してください。例えば:

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

可能であれば、Pgシステムカタログの代わりにSQL標準の移植可能なINFORMATION_SCHEMAを使用することをお勧めしますが、場合によってはPg固有の情報が必要です。そのような場合には システムカタログ を直接問い合わせるのが良いでしょう、そしてpsql -Eはそうするための役に立つガイドになることができます。

184
Craig Ringer

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

\c liferay
\dt

それは私がとにかくやっている方法です。

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

\c liferay \dt
88
d11wtq

公開テーブルを見るには

リストテーブル

\dt

表、ビュー、およびアクセス特権のリスト

\dp or \z

またはテーブル名だけ

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

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
Sevki Kocadag

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

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