2012-09-16 19 views
101

Chciałbym wyświetlić wszystkie tabele w bazie danych liferay w mojej instalacji PostgreSQL. Jak mogę to zrobić?Psql lista wszystkich tabel

Chciałbym wykonać SELECT * FROM applications; w bazie danych liferay. applications to tabela w mojej db lifebay. Jak to się robi?

Oto wykaz wszystkich moich baz danych:

postgres=# \list 
           List of databases 
Name | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+----------+----------+-------------+-------------+----------------------- 
liferay | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres   + 
      |   |   |    |    | postgres=CTc/postgres+ 
      |   |   |    |    | liferay=CTc/postgres 
lportal | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | 
postgres | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | 
template0 | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres   + 
      |   |   |    |    | postgres=CTc/postgres 
template1 | postgres | UTF8  | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres   + 
      |   |   |    |    | postgres=CTc/postgres 
(5 rows) 

postgres=# 

Odpowiedz

163

Jeśli chcesz wymienić wszystkie tabel, należy użyć:

\dt *.* 

się wskazywać, że chcesz wszystkie tabele we wszystkich schematach. Obejmuje to tabele w pg_catalog, tabele systemowe i te w information_schema. Nie ma wbudowanego sposobu mówienia "wszystkie tabele we wszystkich schematach definiowanych przez użytkownika"; możesz jednak ustawić swoją search_path na listę wszystkich schematów, przed uruchomieniem \dt.

Możesz chcieć zrobić to programowo, w takim przypadku psql Polecenia ukośnika odwrotnego nie wykonają zadania. Tutaj na ratunek przychodzi the INFORMATION_SCHEMA. Aby wyświetlić tabele:

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'; 

BTW, jeśli kiedykolwiek chcesz zobaczyć, co psql robi w odpowiedzi na polecenie backslash, uruchom psql z flagą -E. np:

$ psql -E regress  
regress=# \list 
********* QUERY ********** 
SELECT d.datname as "Name", 
     pg_catalog.pg_get_userbyid(d.datdba) as "Owner", 
     pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding", 
     d.datcollate as "Collate", 
     d.datctype as "Ctype", 
     pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges" 
FROM pg_catalog.pg_database d 
ORDER BY 1; 
************************** 

więc widać, że psql poszukuje pg_catalog.pg_database gdy robi listę baz danych. Podobnie, dla tabel w danej bazie danych:

SELECT n.nspname as "Schema", 
    c.relname as "Name", 
    CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type", 
    pg_catalog.pg_get_userbyid(c.relowner) as "Owner" 
FROM pg_catalog.pg_class c 
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE c.relkind IN ('r','') 
     AND n.nspname <> 'pg_catalog' 
     AND n.nspname <> 'information_schema' 
     AND n.nspname !~ '^pg_toast' 
    AND pg_catalog.pg_table_is_visible(c.oid) 
ORDER BY 1,2; 

Jest to korzystne jest stosowanie standardu SQL-przenośne INFORMATION_SCHEMA zamiast katalogach systemowych Pg gdzie jest to możliwe, ale czasami potrzebują Państwo Pg-konkretne informacje. W takich przypadkach wystarczy zapytać bezpośrednio o numer system catalogs, a pomocny może okazać się przewodnik po nim.

+0

Wow! Dziękuję bardzo za BTW. To jest bardzo cenne. –

+0

'information_schema.tables' zawiera widoki z jakiegoś powodu. (W każdym razie w PostgreSQL 9.2). – jpmc26

+0

@ jpmc26 Tak, z 'table_type = 'VIEW'', więc można je łatwo wykluczyć. Ogólnie SQL próbuje traktować widoki tak samo jak tabele tak bardzo, jak to możliwe. –

85

Połącz się z bazą danych, a następnie wymienić tabele:

\c liferay 
\dt 

To jak to zrobić tak.

Można łączyć te dwie komendy na jednej linii, jeśli wolisz:

\c liferay \dt 
+2

rzeczywiście chcesz '\ dt * *' jeśli nie wszystkie stoły w okolicy są na 'search_path. '. –

+2

Dzięki za '\ c db_name' –

+0

Wow wszystko, co dostaję, to' Nie znaleziono relacji. – surfer190

4

Aby zobaczyć tabele publicznych można zrobić

lista tabel

\dt 

przywileje lista tabela, widok, i dostępu

\dp or \z 

lub tylko nazwy tabel

select table_name from information_schema.tables where table_schema = 'public'; 
1

W SQL Que ry, możesz napisać ten kod:

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME'; 

Zastąp swój schemat tabeli za pomocą YOUR_TABLE_SCHEME;

Przykład:

select table_name from information_schema.tables where table_schema='eLearningProject'; 

Aby zobaczyć cały system i wszystkie tabele, nie ma potrzeby, gdy klauzula:

select table_name from information_schema.tables 
-1

Można wpisać \?, aby uzyskać informacje na temat wszystkich poleceń obsługiwanych w psql .

0

ten może być używany w skryptach automatyki jeśli nie musisz wszystkich tabel we wszystkich schematów:

for table in $(psql -qAntc '\dt' | cut -d\| -f2); do 
     ... 
    done