Psql listet alle Tabellen auf

125

Ich möchte alle Tabellen in der liferayDatenbank in meiner PostgreSQL-Installation auflisten. Wie mache ich das?

Ich möchte SELECT * FROM applications;in der liferayDatenbank ausführen . applicationsist ein tisch in meiner liferay db. Wie wird das gemacht?

Hier ist eine Liste aller meiner Datenbanken:

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=# 
Pethel
quelle

Antworten:

203

Wenn Sie alle Tabellen auflisten möchten , müssen Sie Folgendes verwenden:

\dt *.*

um anzuzeigen, dass Sie alle Tabellen in allen Schemas möchten . Dies umfasst Tabellen in pg_catalog, die Systemtabellen und die in information_schema. Es gibt keine integrierte Möglichkeit, "alle Tabellen in allen benutzerdefinierten Schemas" zu sagen. Sie können jedoch search_pathvor dem Ausführen eine Liste aller interessierenden Schemas festlegen \dt.

Möglicherweise möchten Sie dies programmgesteuert tun. In diesem Fall psqlerledigen Backslash-Befehle den Job nicht. Dies ist , wo dieINFORMATION_SCHEMA zur Rettung kommt. So listen Sie Tabellen auf:

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

Übrigens, wenn Sie jemals sehen möchten, was psqlals Reaktion auf einen Backslash-Befehl geschieht, führen Sie ihn psqlmit dem -EFlag aus. z.B:

$ 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;
**************************

Sie können also sehen, dass psqlgesucht wird, pg_catalog.pg_databasewenn eine Liste von Datenbanken abgerufen wird. Ebenso für Tabellen in einer bestimmten Datenbank:

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;

Es ist vorzuziehen, INFORMATION_SCHEMAwenn möglich den tragbaren SQL-Standard anstelle der Pg-Systemkataloge zu verwenden, aber manchmal benötigen Sie Pg-spezifische Informationen. In diesen Fällen ist es in Ordnung, die Systemkataloge direkt abzufragen , und dies psql -Ekann eine hilfreiche Anleitung sein.

Craig Ringer
quelle
information_schema.tablesenthält Ansichten aus irgendeinem Grund. (In PostgreSQL 9.2 jedenfalls.)
jpmc26
@ jpmc26 Ja, mit table_type = 'VIEW', also sind sie leicht auszuschließen. Im Allgemeinen versucht SQL, Ansichten so weit wie möglich wie Tabellen zu behandeln.
Craig Ringer
94

Stellen Sie eine Verbindung zur Datenbank her und listen Sie die Tabellen auf:

\c liferay
\dt

So mache ich es trotzdem.

Sie können diese beiden Befehle in einer einzigen Zeile kombinieren, wenn Sie dies bevorzugen:

\c liferay \dt
d11wtq
quelle
2
Sie möchten tatsächlich, \dt *.*wenn nicht alle interessierenden Tabellen auf der search_path.
Craig Ringer
10

Um die öffentlichen Tabellen zu sehen, können Sie tun

Listentabellen

\dt

Listen-, Ansichts- und Zugriffsrechte auflisten

\dp or \z

oder nur die Tabellennamen

select table_name from information_schema.tables where table_schema = 'public';
nikkypx
quelle
2

In SQL Query können Sie diesen Code schreiben:

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

Ersetzen Sie Ihr Tabellenschema durch YOUR_TABLE_SCHEME.

Beispiel:

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

Um alle Schemata und alle Tabellen anzuzeigen, ist die where-Klausel nicht erforderlich:

select table_name from information_schema.tables
Sevki Kocadag
quelle
1

Ein einzeiliges Beispiel ist

\dt schemaname.* 

in deinem senario

\dt public.*
mcolak
quelle
0

Dies kann in Automatisierungsskripten verwendet werden, wenn Sie nicht alle Tabellen in allen Schemas benötigen:

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

Sie können \?eingeben, um Informationen zu allen in psql unterstützten Befehlen abzurufen.

Sunil Kumar
quelle