Hvis du ønsker at liste alle tabeller, skal du bruge:
\dt *.*
for at angive, at du vil have alle tabeller i alle skemaer . Dette vil inkludere tabeller i pg_catalog , systemtabellerne og dem i information_schema . Der er ingen indbygget måde at sige "alle tabeller i alle brugerdefinerede skemaer"; du kan dog indstille din search_path til en liste over alle skemaer af interesse, før du kører \dt .
Du ønsker måske at gøre dette programmatisk, i hvilket tilfælde psql backslash-kommandoer vil ikke gøre arbejdet. Det er her INFORMATION_SCHEMA kommer til undsætning. Sådan viser du tabeller:
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
BTW, hvis du nogensinde vil se hvad psql udfører som svar på en backslash-kommando, skal du køre psql med -E flag. f.eks.:
$ 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å du kan se den psql søger pg_catalog.pg_database når den får en liste over databaser. Tilsvarende for tabeller i en given 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;
Det er at foretrække at bruge den bærbare INFORMATION_SCHEMA SQL-standard i stedet for Pg-systemkatalogerne, hvor det er muligt, men nogle gange har du brug for Pg-specifik information. I disse tilfælde er det fint at forespørge systemkatalogerne direkte og psql -E kan være en nyttig guide til, hvordan du gør det.