2013-03-26 13 views
201

Kiedy robię \dt w psql, otrzymuję tylko listę tabel w bieżącym schemacie (domyślnie public).Tabele tabel w schemacie PostgreSQL

Jak uzyskać listę wszystkich tabel we wszystkich schematach lub w określonym schemacie?

Odpowiedz

304

We wszystkich schematach:

=> \dt *.* 

W konkretnym schemacie:

=> \dt public.* 

Jest możliwe użycie 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 

Zaawansowani użytkownicy mogą używać notacji regularnych, takich jak klasy znaków, na przykład [0-9], aby dopasować dowolną cyfrę. Wszystkie znaki specjalne wyrażenia regularnego działają zgodnie z opisem w sekcji 9.7.3, z wyjątkiem. który jest traktowany jako separator, jak wspomniano powyżej, * który jest tłumaczony na notację regularną. ,? która jest tłumaczona na., i $, która jest dopasowana dosłownie. Możesz naśladować te znaki w razie potrzeby, pisząc? dla., (R + |) dla R lub (R |) dla R ?. $ nie jest potrzebne jako znak wyrażeń regularnych, ponieważ wzorzec musi pasować do całej nazwy, w przeciwieństwie do zwykłej interpretacji wyrażeń regularnych (innymi słowy, $ jest automatycznie dołączane do twojego wzorca). Napisz * na początku i/lub końcu, jeśli nie chcesz, aby wzór był zakotwiczony. Zauważ, że w podwójnych cudzysłowach wszystkie specjalne znaki specjalne tracą swoje specjalne znaczenia i są dosłownie dopasowane. Również znaki specjalne wyrażenia regularnego są dosłownie dopasowane do wzorców nazw operatorów (tj. Do argumentu \ do).

+1

Po prostu '\ dt' jest równoważne' \ dt public. * ', czy mam rację? –

+0

Co powiesz na przykład na dwie konkretne tabele w określonym schemacie? Jak '\ dt public.user_info, public.user_scope'? –

+0

Nieważne, łatwiej jest zrobić '\ dt public.a; \ dt public.b; 'w jednej linii. –

145

Można wybrać tabele z information_schema

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

Bardzo pomocne, jeśli twój interfejs nie obsługuje skrótów. dzięki. –

+1

To jest również miłe, ponieważ można zrobić coś takiego, jak wybrać table_schema, nazwa_tabeli z pliku_informacyjnego.tabela gdzie nazwa_tabeli taka jak "% cokolwiek%"; jeśli chcesz wiedzieć, w którym schemacie znajduje się tabela. Nie wiesz, czy możesz to zrobić za pomocą \ dt –

+1

Dziękuję, działa na Amazon Redshift, a \ dt (zaakceptowana odpowiedź) nie działa. – Carlos2W

23

Alternatywnie do information_schema możliwe jest użycie pg_tables:

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

pamiętać, że jeśli chcą tylko nazwa tabeli jest kwerenda wypadkowa jest 'SELECT nazwa_tabeli FROM pg_tables GDZIE nazwa_schematu =„publiczna”;' –

+0

Znaleziono problem uprawnienia z 'nie information_schema' wystawianie przedmiotów z' public 'schema, ale metoda' pg_tables' działała ładnie. Wielkie dzięki! –

0

Dla tych, napotykając to w przyszłości:

Jeśli chcesz zobaczyć listę relations dla kilku schematów:

$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 
Powiązane problemy