Psql liste toutes les tables


125

Je voudrais lister toutes les tables de la liferaybase de données dans mon installation PostgreSQL. Comment je fais ça?

Je voudrais exécuter SELECT * FROM applications;dans la liferaybase de données. applicationsest une table dans ma db liferay. Comment cela se fait-il?

Voici une liste de toutes mes bases de données:

postgres=# \list
                              List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
 -----------+----------+----------+-------------+-------------+-----------------------
 liferay   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | liferay=CTc/postgres
 lportal   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 postgres  | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 template0 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=# 

Réponses:


203

Si vous souhaitez lister toutes les 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 dans information_schema. Il n'y a pas de manière intégrée de dire "toutes les tables dans tous les schémas définis par l'utilisateur"; vous pouvez cependant définir votre search_pathsur une liste de tous les schémas d'intérêt avant de l'exécuter \dt.

Vous voudrez peut-être le faire par programme, auquel cas les psqlcommandes anti-slash ne feront pas le travail. C'est là queINFORMATION_SCHEMA vient la rescousse. Pour lister les tableaux:

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

BTW, si vous voulez voir ce qui psqlest fait en réponse à une commande anti-slash, exécutez psqlavec l' -Eindicateur. par exemple:

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

ainsi vous pouvez voir que psqlrecherche pg_catalog.pg_databasequand 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_SCHEMAau lieu des catalogues système Pg lorsque cela est possible, mais parfois vous avez besoin d'informations spécifiques à Pg. Dans ces cas, il est très bien d'interroger directement les catalogues système et psql -Epeut être un guide utile pour savoir comment le faire.


information_schema.tablesinclut des vues pour une raison quelconque. (Dans PostgreSQL 9.2, de toute façon.)
jpmc26

@ jpmc26 Oui, avec table_type = 'VIEW', donc ils sont faciles à exclure. En général, SQL essaie de traiter les vues de la même manière que les tables autant que possible.
Craig Ringer

94

Connectez-vous à la base de données, puis répertoriez les tables:

\c liferay
\dt

C'est comme ça que je le fais de toute façon.

Vous pouvez combiner ces deux commandes sur une seule ligne, si vous préférez:

\c liferay \dt

2
Vous voulez en fait \dt *.*si toutes les tables d'intérêt ne sont pas sur le search_path.
Craig Ringer

10

Pour voir les tables publiques que vous pouvez faire

tableaux de liste

\dt

table de liste, vue et privilèges d'accès

\dp or \z

ou juste les noms de table

select table_name from information_schema.tables where table_schema = 'public';

2

Dans SQL Query, vous pouvez écrire ce code:

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME';

Remplacez votre schéma de table par YOUR_TABLE_SCHEME;

Exemple:

select table_name from information_schema.tables where table_schema='eLearningProject';

Pour voir tous les schémas et toutes les tables, il n'y a pas besoin de clause where:

select table_name from information_schema.tables

1

Un exemple en une ligne est

\dt schemaname.* 

dans ton senario

\dt public.*

0

Cela peut être utilisé dans les scripts d'automatisation si vous n'avez pas besoin de toutes les tables dans tous les schémas:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done

-3

Vous pouvez taper \?pour obtenir des informations sur toutes les commandes prises en charge dans psql.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.