Psql elenca tutte le tabelle


125

Vorrei elencare tutte le tabelle nel liferaydatabase nella mia installazione PostgreSQL. Come lo faccio?

Vorrei eseguire SELECT * FROM applications;nel liferaydatabase. applicationsè un tavolo nel mio db liferay. Come si fa?

Ecco un elenco di tutti i miei database:

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

Risposte:


203

Se si desidera elencare tutte le tabelle, è necessario utilizzare:

\dt *.*

per indicare che si desidera tutte le tabelle in tutti gli schemi . Ciò includerà le tabelle in pg_catalog, le tabelle di sistema e quelle in information_schema. Non esiste un modo integrato per dire "tutte le tabelle in tutti gli schemi definiti dall'utente"; tuttavia, è possibile impostare search_pathun elenco di tutti gli schemi di interesse prima di eseguire \dt.

Potresti voler fare questo a livello di codice, nel qual caso psqli comandi backslash non faranno il lavoro. Questo è dove laINFORMATION_SCHEMA viene in soccorso. Per elencare le tabelle:

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

A proposito, se mai vuoi vedere cosa psqlsta facendo in risposta a un comando di barra rovesciata, esegui psqlcon il -Eflag. per esempio:

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

così puoi vedere che psqlsta cercando pg_catalog.pg_databasequando ottiene un elenco di database. Allo stesso modo, per le tabelle all'interno di un determinato database:

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;

È preferibile utilizzare lo standard SQL, portatile INFORMATION_SCHEMAanziché i cataloghi del sistema Pg ove possibile, ma a volte sono necessarie informazioni specifiche per Pg. In questi casi è bene interrogare direttamente i cataloghi di sistema e psql -Epuò essere una guida utile su come farlo.


information_schema.tablesinclude visualizzazioni per qualche motivo. (In PostgreSQL 9.2, comunque.)
jpmc26,

@ jpmc26 Sì, con table_type = 'VIEW', quindi sono facili da escludere. In generale, SQL cerca di trattare il più possibile le viste come le tabelle.
Craig Ringer,

94

Connettiti al database, quindi elenca le tabelle:

\c liferay
\dt

È così che lo faccio comunque.

Puoi combinare questi due comandi su una sola riga, se preferisci:

\c liferay \dt

2
In realtà vuoi \dt *.*se non tutte le tabelle di interesse sono sul search_path.
Craig Ringer,

10

Per vedere i tavoli pubblici che puoi fare

elenca le tabelle

\dt

elenca i privilegi di tabella, visualizzazione e accesso

\dp or \z

o solo i nomi delle tabelle

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

2

In SQL Query, puoi scrivere questo codice:

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

Sostituisci lo schema della tabella con YOUR_TABLE_SCHEME;

Esempio:

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

Per visualizzare tutti gli schemi e tutte le tabelle, non è necessario specificare la clausola where:

select table_name from information_schema.tables

1

Un esempio di una riga è

\dt schemaname.* 

nel tuo senario

\dt public.*

0

Questo può essere utilizzato negli script di automazione se non sono necessarie tutte le tabelle in tutti gli schemi:

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

-3

È possibile digitare \?per ottenere informazioni su tutti i comandi supportati in psql.

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.