Come posso elencare tutti i database e le tabelle usando psql?


1171

Sto cercando di imparare l'amministrazione PostgreSQL e ho iniziato a imparare come usare lo psqlstrumento da riga di comando.

Quando accedo con psql --username=postgres, come posso elencare tutti i database e le tabelle?

Ho provato \d, de dS+ma niente è in elenco. Ho creato due database e alcune tabelle con pgAdmin III, quindi so che dovrebbero essere elencati.


1
Se vuoi accedervi dalla riga di comando, eseguipsql -l
adriaan il

Questo commento dovrebbe sicuramente essere una delle risposte migliori! Se hai bisogno di auth puoi anche psql --username=postgres -l.
Ulysse BN,

Risposte:


1544

Si prega di notare i seguenti comandi:

  • \listoppure \l: elenca tutti i database
  • \dt: elenca tutte le tabelle nel database corrente

Non vedrai mai tabelle in altri database, queste tabelle non sono visibili. Devi connetterti al database corretto per vedere le sue tabelle (e altri oggetti).

Per cambiare database:

\connect database_name o \c database_name

Vedi il manuale su psql .


131
È possibile utilizzare \c db_nameper connettersi a un determinato database.
Piace il

17
\dtnon sembra elencare tutte le tabelle nel database corrente (sembra escludere quelle che non si trovano search_pathalmeno nel 9.2)
Jack Douglas

22
\dt *.elencherà tutte le tabelle in tutti gli schemi, senza dover modificare il percorso di ricerca.
danpelota,

19
\ l + è il mio preferito - mostra anche l'utilizzo del disco.
Lester Cheung,

1
Su Windows posso elencare i database con questo comando psql -U username -lma non funziona con la versione slash.
NoName Fornito il

350

Questo elenca i database:

SELECT datname FROM pg_database
WHERE datistemplate = false;

Questo elenca le tabelle nel database corrente

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

11
Hai ragione, ma la domanda riguardava i meta-comandi dello strumento psql. \ dt è molto più semplice che digitare qualsiasi query.
Frank Heikens,

19
Penso che questa sia una GRANDE risposta perché può essere eseguita da una riga di comando di Linux invece di dover essere nell'interprete psql che a volte si blocca per me usando ExtraPutty.
Amore e pace - Joe Codeswell,

2
Mi ha anche salvato la giornata. Per il mio caso particolare sto aggiungendo WHERE table_schema = 'public'perché voglio eliminare solo le tabelle personalizzate.
Renra,

29
Se si avvia psql con il flag -E, verrà visualizzata la query reale quando si utilizza un meta-comando.
Deebster,

Questa è una buona risposta Sebbene OP volesse i metacomandi, stavo cercando su Google per questo, e questo mi ha portato a questa domanda.
Getta via l'account

109

In Postgresql questi comandi di terminale elencano i database disponibili

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

O il comando ha dichiarato più semplicemente:

psql -U pgadmin -l

Quei comandi stampano questo sul terminale:

                                  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)

Questi sono i database disponibili.

In PSQL questi comandi elencano le tabelle disponibili

Devi specificare un database prima di poter elencare le tabelle in quel database.

el@defiant$ psql -U pgadmin -d kurz_prod

Questo ti porta ad un terminale psql:

kurz_prod=#

Utilizzare il comando \dsignificato mostra tutte le tabelle, viste e sequenze

kurz_prod=# \d

Questo stampa:

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

Quindi, per uscire dal terminale psql, digitare \qe premere Invio. O Ctrl-Dfa la stessa cosa. Queste sono le tabelle in quel database.


4
\ d non elenca solo le tabelle:\d[S+] list tables, views, and sequences
Jack Douglas

3
Per me, questa è la risposta "corretta" perché non richiede di essere già connesso a un database esistente.
aardvarkk,

71

\lè anche una scorciatoia per \list. Ci sono alcuni comandi slash, che puoi elencare in psql usando \?.


35

Per ottenere maggiori informazioni sul database e sull'elenco delle tabelle, puoi fare:

\l+ per elencare i database

                                                                    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)

e

\d+ per elencare tutte le tabelle nello schema corrente del percorso di ricerca nel database corrente.

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

Da pg_Admin puoi semplicemente eseguire quanto segue sul tuo database corrente e otterrà tutte le tabelle per lo schema specificato:

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

Questo ti porterà un elenco di tutte le tabelle permanenti (generalmente le tabelle che stai cercando). È possibile ottenere solo i nomi delle tabelle se si cambia il *carattere jolly in solo il table_name. Il pubblico table_schemaè lo schema predefinito per la maggior parte dei database a meno che l'amministratore non abbia impostato un nuovo schema.


3
Sebbene ciò sia vero, si rivolge a un client diverso da quello richiesto dall'OP.
dezso

Questo ha funzionato benissimo per me, e sebbene il mio caso d'uso non fosse esattamente quello richiesto dall'OP, mi ha aiutato a ottenere l'elenco dei tavoli mentre ero collegato tramite wrapper (in Julialang LibPQ.jl )
Vass

19

È possibile che tu abbia inserito le tabelle in uno schema che non si trova nel tuo percorso di ricerca, o il valore predefinito, cioè pubblico, e quindi le tabelle non verranno visualizzate usando \ dt. Se usi uno schema chiamato, diciamo, dati, puoi risolverlo eseguendo,

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

Esci e rientra in psql e ora \ dt ti mostrerà anche le tabelle nei dati dello schema.


1
Bene, anche un semplice set search_path=data, public;farebbe il trucco :)
dezso

@dezso, questo apporta la modifica in modo permanente o solo in quella sessione psql?
John Powell,

Err, non ero molto chiaro. Era previsto al posto del ciclo logout-login.
dezso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.