Jeśli chcesz wymienić wszystkie tabele, musisz użyć:
\dt *.*
aby wskazać, że chcesz, aby wszystkie tabele we wszystkich schematach . Obejmuje to tabele w pg_catalog
, tabele systemowe i te w information_schema
. Nie ma wbudowanego sposobu powiedzenia „wszystkie tabele we wszystkich schematach zdefiniowanych przez użytkownika”; możesz jednak ustawić swoją search_path
do listy wszystkich interesujących schematów przed uruchomieniem \dt
.
Możesz to zrobić programowo, w takim przypadku psql
polecenia z odwrotnym ukośnikiem nie wykonają zadania. W tym miejscu INFORMATION_SCHEMA
przychodzi na ratunek. Aby wyświetlić tabele:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
BTW, jeśli kiedykolwiek chcesz zobaczyć, co psql
robi w odpowiedzi na polecenie odwrotnego ukośnika, uruchom psql
z -E
flaga. np.:
$ 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 psql
przeszukuje pg_catalog.pg_database
kiedy otrzyma 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 INFORMATION_SCHEMA
w standardzie SQL zamiast katalogów systemowych PG tam, gdzie to możliwe, ale czasami potrzebujesz informacji specyficznych dla PG. W takich przypadkach dobrze jest bezpośrednio odpytywać katalogi systemowe i psql -E
może być pomocnym przewodnikiem, jak to zrobić.