Psql daftarkan semua tabel

125

Saya ingin mendaftar semua tabel dalam liferaydatabase di instalasi PostgreSQL saya. Bagaimana aku melakukan itu?

Saya ingin mengeksekusi SELECT * FROM applications;di liferaydatabase. applicationsadalah tabel di liferay db saya. Bagaimana ini dilakukan?

Berikut daftar semua basis data saya:

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=# 
Pethel
sumber

Jawaban:

203

Jika Anda ingin mendaftar semua tabel, Anda harus menggunakan:

\dt *.*

untuk menunjukkan bahwa Anda ingin semua tabel di semua skema . Ini akan termasuk tabel dalam pg_catalog, tabel sistem, dan tabel information_schema. Tidak ada cara bawaan untuk mengatakan "semua tabel di semua skema yang ditentukan pengguna"; Anda dapat, bagaimanapun, mengatur Anda search_pathke daftar semua skema yang menarik sebelum berjalan \dt.

Anda mungkin ingin melakukan ini secara terprogram, dalam hal ini psqlperintah backslash tidak akan melakukan pekerjaan. Ini adalah tempat yangINFORMATION_SCHEMA datang untuk menyelamatkan. Untuk daftar tabel:

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

BTW, jika Anda ingin melihat apa psqlyang dilakukan sebagai respons terhadap perintah backslash, jalankan psqldengan -Eflag. misalnya:

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

sehingga Anda dapat melihat bahwa psqlsedang mencari pg_catalog.pg_databaseketika mendapat daftar database. Demikian pula, untuk tabel dalam database yang diberikan:

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;

Lebih baik menggunakan SQL-standard, portable INFORMATION_SCHEMAdaripada katalog sistem Pg jika memungkinkan, tetapi kadang-kadang Anda membutuhkan informasi spesifik Pg. Dalam kasus tersebut, Anda dapat langsung menanyakan katalog sistem secara langsung, dan psql -Edapat menjadi panduan yang bermanfaat untuk melakukannya.

Craig Ringer
sumber
information_schema.tablestermasuk tampilan untuk beberapa alasan. (
Lagi
@ jpmc26 Ya, dengan table_type = 'VIEW', jadi mereka mudah dikecualikan. Secara umum SQL mencoba untuk memperlakukan tampilan yang sama dengan tabel sebanyak mungkin.
Craig Ringer
94

Sambungkan ke database, lalu daftarkan tabel:

\c liferay
\dt

Begitulah cara saya melakukannya.

Anda dapat menggabungkan kedua perintah ke satu baris, jika Anda lebih suka:

\c liferay \dt
d11wtq
sumber
2
Anda benar-benar ingin \dt *.*jika tidak semua tabel minat ada di search_path.
Craig Ringer
10

Untuk melihat tabel publik bisa Anda lakukan

daftar tabel

\dt

daftar tabel, lihat, dan akses hak istimewa

\dp or \z

atau hanya nama tabel

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

Di SQL Query, Anda dapat menulis kode ini:

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

Ganti skema tabel Anda dengan YOUR_TABLE_SCHEME;

Contoh:

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

Untuk melihat semua skema dan semua tabel, tidak perlu di mana klausa:

select table_name from information_schema.tables
Sevki Kocadag
sumber
1

Contoh satu baris adalah

\dt schemaname.* 

di senario Anda

\dt public.*
mcolak
sumber
0

Ini dapat digunakan dalam skrip otomatisasi jika Anda tidak memerlukan semua tabel di semua skema:

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

Anda dapat mengetik \?untuk mendapatkan informasi tentang semua perintah yang didukung dalam psql.

Sunil Kumar
sumber