137 votes

Psql liste toutes les tables

Je voudrais lister toutes les tables dans le liferay dans mon installation PostgreSQL. Comment dois-je m'y prendre ?

Je voudrais exécuter SELECT * FROM applications; dans le liferay base de données. applications est une table dans ma base de données Liferay. Comment cela se passe-t-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=#

226voto

Craig Ringer Points 72371

Si vous souhaitez répertorier todo les tables, vous devez utiliser :

\dt *.*

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

Il se peut que vous souhaitiez effectuer cette opération de manière programmatique, auquel cas psql Les commandes backslash ne feront pas l'affaire. C'est là que les le site 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 backslash, exécutez psql avec le -E drapeau, 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;
**************************

pour que vous puissiez voir que psql est en train de chercher 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 la norme SQL, portable. INFORMATION_SCHEMA au lieu des catalogues du système Pg lorsque cela est possible, mais parfois vous avez besoin d'informations spécifiques à Pg. Dans ce cas, il est possible d'interroger les catalogues du système Pg. catalogues de systèmes directement, et psql -E peut être un guide utile sur la manière de le faire.

0 votes

information_schema.tables inclut les vues pour une raison quelconque. (Dans PostgreSQL 9.2, en tout cas).

0 votes

@jpmc26 Oui, avec table_type = 'VIEW' Il est donc facile de les exclure. En général, SQL essaie de traiter les vues de la même manière que les tables, dans la mesure du possible.

94voto

d11wtq Points 17790

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

\c liferay
\dt

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

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

\c liferay \dt

2 votes

Vous voulez vraiment \dt *.* si toutes les tables d'intérêt ne sont pas sur le search_path .

12voto

nikkypx Points 1232

Pour voir les tables publiques, vous pouvez faire

tableaux de listes

\dt

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

\dp or \z

ou juste les noms des tables

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

3voto

Sevki Bekir Points 77

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 VOTRE_TABLE_SCHEME ;

Ejemplo:

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

Pour voir tous les schémas et toutes les tables, il n'est pas nécessaire d'utiliser la clause where :

select table_name from information_schema.tables

2voto

mcolak Points 1

Voici un exemple d'une ligne :

\dt schemaname.* 

Dans votre scénario :

\dt public.*

Et pour obtenir une liste de schémas :

\dn

Notez que public est le schéma par défaut si aucun n'est spécifié. En citant le documentation :

Dans les sections précédentes, nous avons créé des tables sans spécifier aucun noms de schémas. Par défaut, de telles tables (et d'autres objets) sont automatiquement placés dans un schéma nommé "public". Chaque nouvelle base de données contient un tel schéma.

Utilisation de \dt *.* produira une longue liste de toutes les tables dans tous les schémas, y compris les tables internes telles que pg_catalog . Les éléments ci-dessus peuvent aider au filtrage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X