PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Psql listet alle Tabellen auf

Wenn Sie alle auflisten möchten Tabellen müssen Sie verwenden:

\dt *.*

um anzuzeigen, dass Sie alle Tabellen in allen Schemas haben möchten . Dies schließt Tabellen in pg_catalog ein , die Systemtabellen und die in information_schema . Es gibt keine eingebaute Möglichkeit, „alle Tabellen in allen benutzerdefinierten Schemas“ zu sagen; Sie können jedoch Ihren search_path festlegen zu einer Liste aller relevanten Schemas, bevor Sie \dt ausführen .

Möglicherweise möchten Sie dies programmgesteuert tun, in diesem Fall psql Backslash-Befehle werden die Arbeit nicht erledigen. Hier ist das INFORMATION_SCHEMA kommt zur Rettung. Um Tabellen aufzulisten:

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

Übrigens, wenn Sie jemals sehen wollen, was psql ist als Antwort auf einen Backslash-Befehl tut, führen Sie psql aus mit dem -E Flagge. zB:

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

damit Sie diesen psql sehen können sucht pg_catalog.pg_database wenn es eine Liste von Datenbanken erhält. Ähnlich für Tabellen innerhalb einer gegebenen Datenbank:

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;

Es ist vorzuziehen, das portable SQL-Standard-INFORMATION_SCHEMA zu verwenden anstelle der Pg-Systemkataloge, wenn möglich, aber manchmal benötigen Sie Pg-spezifische Informationen. In diesen Fällen ist es in Ordnung, die Systemkataloge direkt abzufragen, und psql -E kann eine hilfreiche Anleitung dafür sein.