Om du vill lista alla tabeller måste du använda:
\dt *.*
för att indikera att du vill ha alla tabeller i alla scheman . Detta kommer att inkludera tabeller i pg_catalog
, systemtabellerna och de i information_schema
. Det finns inget inbyggt sätt att säga "alla tabeller i alla användardefinierade scheman"; du kan dock ställa in din search_path
till en lista över alla scheman av intresse innan du kör \dt
.
Du kanske vill göra detta programmatiskt, i vilket fall psql
backslash-kommandon kommer inte att göra jobbet. Det är här INFORMATION_SCHEMA
kommer till undsättning. För att lista tabeller:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
BTW, om du någonsin vill se vad psql
gör som svar på ett omvänt snedstreck kommando, kör psql
med -E
flagga. t.ex.:
$ 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;
**************************
så att du kan se den psql
söker pg_catalog.pg_database
när den får en lista över databaser. På samma sätt, för tabeller inom en given databas:
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;
Det är att föredra att använda den bärbara SQL-standarden INFORMATION_SCHEMA
istället för Pg-systemkatalogerna där det är möjligt, men ibland behöver du Pg-specifik information. I dessa fall går det bra att fråga systemkatalogerna direkt och psql -E
kan vara en användbar guide för hur du gör det.