Comment lister toutes les bases de données et tables avec psql?


1171

J'essaie d'apprendre l'administration de PostgreSQL et je commence à apprendre à utiliser l' psqloutil de ligne de commande.

Quand je me connecte avec psql --username=postgres, comment lister toutes les bases de données et les tables?

Je l' ai essayé \d, det dS+mais rien est répertorié. J'ai créé deux bases de données et quelques tables avec pgAdmin III, je sais donc qu'elles devraient être répertoriées.


1
Si vous voulez y accéder via la ligne de commande, lancezpsql -l
adriaan le

Ce commentaire devrait certainement être l'une des meilleures réponses! Si vous avez besoin d'authentification, vous pouvez aussi psql --username=postgres -l.
Ulysse BN le

Réponses:


1544

Veuillez noter les commandes suivantes:

  • \listou \l: lister toutes les bases de données
  • \dt: liste toutes les tables de la base de données courante

Vous ne verrez jamais de tables dans d'autres bases de données, ces tables ne sont pas visibles. Vous devez vous connecter à la bonne base de données pour voir ses tables (et autres objets).

Pour changer de base de données:

\connect database_name ou \c database_name

Voir le manuel sur psql .


131
Vous pouvez utiliser \c db_namepour vous connecter à une certaine base de données.
eikes

17
\dtne semble pas lister toutes les tables de la base de données actuelle (elle semble exclure celles qui ne se trouvent pas dans la version search_path9.2 au moins)
Jack Douglas

22
\dt *.listera toutes les tables dans tous les schémas, sans avoir à modifier votre chemin de recherche.
danpelota

19
\ l + est mon préféré - il montre également l’utilisation du disque.
Lester Cheung

1
Sous Windows, je peux lister les bases de données avec cette commande psql -U username -lmais cela ne fonctionne pas avec la version slash.
NoName Fourni

350

Ceci liste les bases de données:

SELECT datname FROM pg_database
WHERE datistemplate = false;

Ceci liste les tables dans la base de données courante

SELECT table_schema,table_name
FROM information_schema.tables
ORDER BY table_schema,table_name;

11
Vous avez raison, mais la question portait sur les méta-commandes de l'outil psql. \ dt est beaucoup plus facile que de taper une requête.
Frank Heikens

19
Je pense que c’est une excellente réponse car elle peut être exécutée à partir d’une ligne de commande Linux au lieu d’être dans l’interpréteur psql qui se bloque parfois pour moi avec ExtraPutty.
Amour et paix - Joe Codeswell

2
Aussi sauvé ma journée. Dans mon cas particulier, j'ajoute WHERE table_schema = 'public'parce que je veux supprimer uniquement les tables personnalisées.
Renra

29
Si vous démarrez psql avec l'indicateur -E, la requête réelle s'affichera lorsque vous utiliserez une méta-commande.
Deebster

C'est une bonne réponse. Bien qu'OP souhaitait les métacommandes, j'étais sur Google pour cela, et cela m'a amené à cette question.
Compte Throw Away

109

Dans Postgresql, ces commandes de terminal listent les bases de données disponibles

el@defiant$ /bin/psql -h localhost --username=pgadmin --list

Ou la commande a déclaré plus simplement:

psql -U pgadmin -l

Ces commandes impriment ceci sur le terminal:

                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 kurz_prod | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 pgadmin   | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

Ce sont les bases de données disponibles.

Dans PSQL, ces commandes listent les tables disponibles

Vous devez spécifier une base de données avant de pouvoir répertorier les tables de cette base.

el@defiant$ psql -U pgadmin -d kurz_prod

Cela vous amène à un terminal psql:

kurz_prod=#

Utilisez la commande qui \dsignifie montrer toutes les tables, vues et séquences

kurz_prod=# \d

Cela imprime:

           List of relations
Schema |  Name   |   Type   |  Owner
--------+---------+----------+---------
public | mytable | table    | pgadmin
public | testing | sequence | pgadmin
(2 rows)

Ensuite, pour quitter le terminal psql, tapez \qet appuyez sur entrée. Ou Ctrl-Dfait la même chose. Ce sont les tables de cette base de données.


4
\ d ne se contente pas de lister les tables:\d[S+] list tables, views, and sequences
Jack Douglas

3
Pour moi, c'est la réponse "correcte" car elle ne nécessite pas que vous soyez déjà connecté à une base de données existante.
aardvarkk

71

\lest aussi un raccourci pour \list. Il existe plusieurs commandes slash que vous pouvez lister dans psql en utilisant \?.


35

Pour obtenir plus d'informations sur la base de données et la liste de tables, vous pouvez effectuer les opérations suivantes:

\l+ pour lister des bases de données

                                                                    List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   |  Size   | Tablespace |                Description
------------+----------+----------+-------------+-------------+-----------------------+---------+------------+--------------------------------------------
 pgbench    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 29 MB   | pg_default |
 postgres   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 6073 kB | pg_default | default administrative connection database
 slonmaster | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1401 MB | movespace  |
 slonslave  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 32 MB   | pg_default |
 template0  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5785 kB | pg_default | unmodifiable empty database
            |          |          |             |             | postgres=CTc/postgres |         |            |
 template1  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5985 kB | pg_default | default template for new databases
            |          |          |             |             | postgres=CTc/postgres |         |            |
 test       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 13 MB   | pg_default |
(7 rows)

et

\d+ pour lister toutes les tables du schéma search_path actuel de la base de données courante.

test=# \dn+ --list schemas
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =UC/postgres         | 
schema1 | postgres | postgres=UC/postgres+| 
        |          | =UC/postgres         | 
(2 row)

test=# set search_path to schema1, public;
SET
test=# \d+
                                  List of relations
     Schema  |      Name       | Type  |    Owner     |    Size    | Description
    ---------+-----------------+-------+--------------+------------+-------------
     public  | all_units       | table | postgres     | 0 bytes    |
     public  | asset           | table | postgres     | 16 kB      |
     public  | asset_attribute | table | postgres     | 8192 bytes |
     public  | food            | table | postgres     | 48 kB      |
     public  | name_log        | table | postgres     | 8192 bytes |
     public  | outable         | table | ordinaryuser | 0 bytes    |
     public  | outable2        | table | ordinaryuser | 0 bytes    |
     public  | test            | table | postgres     | 16 kB      |
     public  | usr             | table | postgres     | 5008 kB    |
     schema1 | t1              | table | postgres     | 0 bytes    |
    (10 rows)

33

À partir de pg_Admin, vous pouvez simplement exécuter les opérations suivantes sur votre base de données actuelle. Toutes les tables du schéma spécifié seront alors récupérées:

SELECT * 
FROM information_schema.tables 
WHERE table_type = 'BASE TABLE' 
    AND table_schema = 'public' 
ORDER BY table_type, table_name

Cela vous donnera une liste de toutes les tables permanentes (généralement les tables que vous recherchez). Vous pouvez obtenir uniquement les noms de table si vous modifiez le *caractère générique uniquement table_name. Le public table_schemaest le schéma par défaut pour la plupart des bases de données, sauf si votre administrateur a configuré un nouveau schéma.


3
Bien que cela soit vrai, cela s'adresse à un client différent de celui sur lequel l'OP a été interrogé.
dezso

Cela a très bien fonctionné pour moi, et bien que mon cas d'utilisation était pas exactement ce que l'OP a demandé, il m'a aidé à obtenir la liste des tables lorsque vous êtes connecté par emballage (en Julialang LibPQ.jl )
Vass

19

Il est possible que vous ayez inséré les tables dans un schéma qui ne se trouve pas dans le chemin de recherche ou dans celui par défaut, c'est-à-dire public. Les tables ne s'afficheront donc pas avec \ dt. Si vous utilisez un schéma appelé, disons, données, vous pouvez résoudre ce problème en exécutant:

alter database <databasename> set search_path=data, public;

Quittez et entrez à nouveau psql et \ dt vous montrera également les tables dans les données du schéma.


1
Eh bien, un simple set search_path=data, public;ferait l'affaire aussi :)
dezso

@dezso, est ce que le changement est fait de manière permanente, ou juste dans cette session psql?
John Powell

Euh, je n'étais pas très clair. C'était destiné à la place du cycle de déconnexion-connexion.
dezso
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.