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.