2013-03-26 15 views
201

Quando eseguo uno \dt in psql, ottengo solo un elenco di tabelle nello schema corrente (public per impostazione predefinita).Elenca tabelle in uno schema PostgreSQL

Come posso ottenere un elenco di tutte le tabelle in tutti gli schemi o uno schema particolare?

risposta

304

In tutti gli schemi:

=> \dt *.* 

In uno schema particolare:

=> \dt public.* 

E 'possibile utilizzare regular expressions with some 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 

Gli utenti esperti possono utilizzare le notazioni di espressioni regolari come le classi di caratteri, ad esempio [0-9] per corrispondere a qualsiasi cifra. Tutti i caratteri speciali dell'espressione regolare funzionano come specificato nella Sezione 9.7.3, eccetto per. che è preso come separatore come menzionato sopra, * che è tradotto nella notazione di espressioni regolari. ,? che è tradotto in., e $ che è abbinato letteralmente. È possibile emulare questi caratteri di pattern quando necessario scrivendo? per., (R + |) per R o (R |) per R ?. $ non è necessario come carattere di espressione regolare poiché il pattern deve corrispondere all'intero nome, diversamente dalla solita interpretazione delle espressioni regolari (in altre parole, $ viene automaticamente aggiunto al tuo pattern). Scrivi * all'inizio e/o alla fine se non desideri che il modello sia ancorato. Nota che tra virgolette doppie, tutti i personaggi speciali delle espressioni regolari perdono i loro significati speciali e sono abbinati letteralmente. Inoltre, i caratteri speciali di espressioni regolari sono abbinati letteralmente in modelli di nomi di operatori (ad esempio, l'argomento di \ do).

+1

Semplicemente '\ dt' è equivolto a' \ dt public. * ', ho ragione? –

+0

Che ne dici, ad esempio, di due tabelle specifiche in uno schema specifico? Ti piace '\ dt public.user_info, public.user_scope'? –

+0

Non importa, è più facile fare '\ dt public.a; \ dt public.b; 'su una riga. –

145

è possibile selezionare le tabelle da information_schema

SELECT * FROM information_schema.tables 
WHERE table_schema = 'public' 
+3

molto utile se l'interfaccia non supporta le scorciatoie. Grazie. –

+1

Questo è anche bello perché si potrebbe fare qualcosa come selezionare table_schema, table_name da information_schema.tables dove table_name come '% whatever%'; se è necessario conoscere lo schema in cui si trova la tabella. Non è sicuro che lo si possa fare con \ dt –

+1

Grazie, funziona su Amazon Redshift e \ dt (risposta accettata) no. – Carlos2W

23

alternativa a information_schema è possibile utilizzare pg_tables:

select * from pg_tables where schemaname='public'; 
+0

nota che se vuoi solo il nome della tabella è la query risultante è 'SELECT tablename FROM pg_tables WHERE schemaname = 'public';' –

+0

Trovato un problema di autorizzazioni con 'information_schema' non elencando gli elementi dal' schema public', ma il metodo 'pg_tables' ha funzionato bene. Grazie molto! –

0

Per chi viene in questo in futuro:

Se vuoi vedere un elenco di relazioni per diversi schemi:

$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 
Problemi correlati