Psql wyświetla wszystkie tabele

125

Chciałbym wyświetlić wszystkie tabele w liferaybazie danych w mojej instalacji PostgreSQL. W jaki sposób mogę to zrobić?

Chciałbym wykonać SELECT * FROM applications;w liferaybazie danych. applicationsto tabela w mojej bazie danych Liferay. Jak to się robi?

Oto lista wszystkich moich baz danych:

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
źródło

Odpowiedzi:

203

Jeśli chcesz wyświetlić wszystkie tabele, musisz użyć:

\dt *.*

aby wskazać, że chcesz mieć wszystkie tabele we wszystkich schematach . Obejmuje to tabele w pg_catalogprogramie, tabele systemowe i te w programie information_schema. Nie ma wbudowanego sposobu, aby powiedzieć „wszystkie tabele we wszystkich schematach zdefiniowanych przez użytkownika”; możesz jednak ustawić search_pathlistę wszystkich interesujących schematów przed uruchomieniem \dt.

Możesz to zrobić programowo, w takim przypadku psqlpolecenia z odwrotnym ukośnikiem nie wykonają zadania. To gdzie przychodzi na ratunek. Aby wyświetlić tabele:INFORMATION_SCHEMA

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

BTW, jeśli kiedykolwiek chcesz zobaczyć, co psqlrobi w odpowiedzi na polecenie z ukośnikiem odwrotnym, uruchom psqlz -Eflagą. na przykład:

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

więc możesz zobaczyć, że psqlwyszukuje, pg_catalog.pg_databasekiedy dostaje listę baz danych. Podobnie dla tabel w danej bazie danych:

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;

Lepiej jest używać przenośnego standardu SQL INFORMATION_SCHEMAzamiast katalogów systemowych Pg, jeśli to możliwe, ale czasami potrzebujesz informacji specyficznych dla Pg. W takich przypadkach można bezpośrednio przeszukiwać katalogi systemowe i psql -Emoże być pomocnym przewodnikiem, jak to zrobić.

Craig Ringer
źródło
information_schema.tableszawiera widoki z jakiegoś powodu. (W każdym razie w PostgreSQL 9.2.)
jpmc26
@ jpmc26 Tak, z table_type = 'VIEW', więc łatwo je wykluczyć. Zasadniczo SQL stara się traktować widoki tak samo, jak tabele, na ile to możliwe.
Craig Ringer
94

Połącz się z bazą danych, a następnie wypisz tabele:

\c liferay
\dt

W każdym razie tak to robię.

Jeśli wolisz, możesz połączyć te dwa polecenia w jedną linię:

\c liferay \dt
d11wtq
źródło
2
Właściwie chcesz, \dt *.*jeśli nie wszystkie interesujące tabele są na search_path.
Craig Ringer
10

Aby zobaczyć stoły publiczne, możesz to zrobić

lista tabel

\dt

lista uprawnień do tabeli, widoku i dostępu

\dp or \z

lub tylko nazwy tabel

select table_name from information_schema.tables where table_schema = 'public';
nikkypx
źródło
2

W zapytaniu SQL możesz napisać następujący kod:

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

Zamień schemat tabeli na YOUR_TABLE_SCHEME;

Przykład:

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

Aby zobaczyć cały schemat i wszystkie tabele, nie ma potrzeby stosowania klauzuli where:

select table_name from information_schema.tables
Sevki Kocadag
źródło
1

Przykładem jednowierszowym jest

\dt schemaname.* 

w twoim senario

\dt public.*
mcolak
źródło
0

Można tego użyć w skryptach automatyzacji, jeśli nie potrzebujesz wszystkich tabel we wszystkich schematach:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done
danbst
źródło
-3

Możesz wpisać, \?aby uzyskać informacje o wszystkich poleceniach obsługiwanych w psql.

Sunil Kumar
źródło