PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Psql liste toutes les tables

Si vous souhaitez lister tous tables, vous devez utiliser :

\dt *.*

pour indiquer que vous voulez toutes les tables dans tous les schémas . Cela inclura les tables dans pg_catalog , les tables système et celles de information_schema . Il n'y a pas de moyen intégré de dire "toutes les tables dans tous les schémas définis par l'utilisateur" ; vous pouvez cependant définir votre search_path à une liste de tous les schémas d'intérêt avant d'exécuter \dt .

Vous voudrez peut-être le faire par programmation, auquel cas psql Les commandes antislash ne feront pas l'affaire. C'est là que le INFORMATION_SCHEMA vient à la rescousse. Pour lister les tables :

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

BTW, si jamais vous voulez voir ce que psql fait en réponse à une commande antislash, exécutez psql avec le -E drapeau. 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;
**************************

pour que vous puissiez voir que psql recherche pg_catalog.pg_database lorsqu'il obtient une liste de bases de données. De même, pour les tables d'une base de données donnée :

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;

Il est préférable d'utiliser le standard SQL portable INFORMATION_SCHEMA au lieu des catalogues système Pg si possible, mais parfois vous avez besoin d'informations spécifiques à Pg. Dans ces cas, il est bon d'interroger directement les catalogues système et psql -E peut être un guide utile pour savoir comment procéder.