Lister les tables dans un schéma PostgreSQL

330

Quand je fais un \dt psql, je ne reçois qu'une liste des tables dans le schéma actuel ( publicpar défaut).

Comment obtenir une liste de toutes les tables dans tous les schémas ou un schéma particulier?

Nyxynyx
la source

Réponses:

506

Dans tous les schémas:

=> \dt *.*

Dans un schéma particulier:

=> \dt public.*

Il est possible d'utiliser des expressions régulières avec certaines restrictions

\dt (public|s).(s|t)
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 public | s    | table | cpn
 public | t    | table | cpn
 s      | t    | table | cpn

Les utilisateurs avancés peuvent utiliser des notations d'expressions régulières telles que des classes de caractères, par exemple [0-9] pour faire correspondre n'importe quel chiffre. Tous les caractères spéciaux d'expression régulière fonctionnent comme spécifié dans la section 9.7.3, à l'exception de celui .qui est pris comme séparateur comme mentionné ci-dessus, *qui est traduit en notation d'expression régulière .*, ?qui est traduit en ., et $qui correspond littéralement. Vous pouvez émuler ces caractères de modèle au besoin en écrivant ?pour ., (R+|)pour R*ou (R|)pour est automatiquement ajouté à votre modèle). ÉcrireR? . $n'est pas nécessaire en tant que caractère d'expression régulière car le modèle doit correspondre au nom entier, contrairement à l'interprétation habituelle des expressions régulières (en d'autres termes,$*au début et / ou à la fin si vous ne souhaitez pas que le motif soit ancré. Notez que dans les guillemets doubles, tous les caractères spéciaux d'expression régulière perdent leur signification spéciale et sont mis en correspondance littéralement. En outre, les caractères spéciaux d'expression régulière sont mis en correspondance littéralement dans les modèles de nom d'opérateur (c'est-à-dire l'argument de \do).

Clodoaldo Neto
la source
6
\dtEst tout simplement équivalent à \dt public.*, ai-je raison?
Frozen Flame
Que diriez-vous, disons, de deux tables spécifiques dans un schéma spécifique? Comme \dt public.user_info, public.user_scope?
James M. Lay
Peu importe, c'est plus facile de le faire \dt public.a; \dt public.b;sur une seule ligne.
James M. Lay
c'est un peu implicite .. Si \ dt ne donne que des tables "publiques", on ne s'attendrait à rien de plus via des expressions régulières ..
mehmet
1
@FrozenFlame Ce n'est pas le cas! Par défaut, il affiche tout ce qui se trouve dans votre search_path, et qui est par défaut "$user", public.*. Par conséquent, set search_path=s; \dtva répertorier toutes les tables du schéma s.
Lukas Juhrich
258

Vous pouvez sélectionner les tableaux à partir de information_schema

SELECT * FROM information_schema.tables 
WHERE table_schema = 'public'
Jakub Kania
la source
7
très utile si votre interface ne prend pas en charge les raccourcis. Merci.
Matt Bannert
1
C'est aussi bien parce que vous pouvez faire quelque chose comme select table_schema, table_name dans information_schema.tables où table_name comme '% any%'; si vous avez besoin de savoir dans quel schéma se trouve la table. Vous n'êtes pas sûr de pouvoir le faire avec \ dt
Josh Brown
2
Merci, cela fonctionne sur Amazon Redshift et \ dt (réponse acceptée) ne fonctionne pas.
Carlos2W
2
C'est la réponse la plus généralement utile. information_schema est défini dans les normes SQL et disponible sur la plupart des bases de données conformes
Davos
54

Alternativement, information_schemail est possible d'utiliser pg_tables:

select * from pg_tables where schemaname='public';
Radek Postołowicz
la source
3
notez que si vous voulez seulement que le nom de la table soit la requête résultante, c'estSELECT tablename FROM pg_tables WHERE schemaname = 'public';
Grant Humphries
Un problème d'autorisations a été trouvé avec la information_schemanon-liste des éléments du publicschéma, mais la pg_tablesméthode a bien fonctionné. Merci beaucoup!
John Crawford
8

Pour ceux qui rencontreront cela à l'avenir:

Si vous souhaitez voir une liste de relations pour plusieurs schémas:

$psql mydatabase
mydatabase=# SET search_path TO public, usa;   #schema examples
SET
mydatabase=# \dt
              List of relations
 Schema |      Name       | Type  |  Owner
--------+-----------------+-------+----------
 public | counties        | table | postgres
 public | spatial_ref_sys | table | postgres
 public | states          | table | postgres
 public | us_cities       | table | postgres
 usa    | census2010      | table | postgres
Blee
la source