私の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=#
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
はそうするための役に立つガイドになることができます。
データベースに接続してからテーブルをリストします。
\c liferay
\dt
それは私がとにかくやっている方法です。
必要に応じて、これら2つのコマンドを1行にまとめることができます。
\c liferay \dt
公開テーブルを見るには
リストテーブル
\dt
表、ビュー、およびアクセス特権のリスト
\dp or \z
またはテーブル名だけ
select table_name from information_schema.tables where table_schema = 'public';
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
すべてのスキーマにすべてのテーブルが必要でない場合は、これを自動化スクリプトで使用できます。
for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
...
done