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.

Jonas
la source
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 .

Frank Heikens
la source
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;
RolandoMySQLDBA
la source
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.

Eric Leschinski
la source
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 \?.

Derek Arnold
la source
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)
Soni Harriz
la source
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.

Larry W
la source
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.

John Powell
la source
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