Psql lista todas las tablas

125

Me gustaría enumerar todas las tablas en la liferaybase de datos en mi instalación de PostgreSQL. ¿Cómo puedo hacer eso?

Me gustaría ejecutar SELECT * FROM applications;en la liferaybase de datos. applicationses una tabla en mi liferay db. ¿Cómo se hace esto?

Aquí hay una lista de todas mis bases de datos:

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
fuente

Respuestas:

203

Si desea enumerar todas las tablas, debe usar:

\dt *.*

para indicar que desea todas las tablas en todos los esquemas . Esto incluirá tablas en pg_catalog, las tablas del sistema y aquellas en information_schema. No hay una forma integrada de decir "todas las tablas en todos los esquemas definidos por el usuario"; sin embargo, puede configurar su search_pathlista de todos los esquemas de interés antes de ejecutar \dt.

Es posible que desee hacer esto mediante programación, en cuyo caso psqllos comandos de barra diagonal inversa no harán el trabajo. Aquí es donde elINFORMATION_SCHEMA viene al rescate. Para enumerar tablas:

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

Por cierto, si alguna vez quieres ver qué psqlestá haciendo en respuesta a un comando de barra invertida, corre psqlcon la -Ebandera. p.ej:

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

para que pueda ver que psqlestá buscando pg_catalog.pg_databasecuando obtiene una lista de bases de datos. Del mismo modo, para tablas dentro de una base de datos dada:

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 preferible utilizar el estándar SQL, portátil en INFORMATION_SCHEMAlugar de los catálogos del sistema Pg cuando sea posible, pero a veces necesita información específica de Pg. En esos casos, está bien consultar los catálogos del sistema directamente, y psql -Epuede ser una guía útil sobre cómo hacerlo.

Craig Ringer
fuente
information_schema.tablesincluye vistas por alguna razón. (En PostgreSQL 9.2, de todos modos.)
jpmc26
@ jpmc26 Sí, con table_type = 'VIEW', por lo que son fáciles de excluir. En general, SQL intenta tratar las vistas lo mismo que las tablas tanto como sea posible.
Craig Ringer
94

Conéctese a la base de datos, luego enumere las tablas:

\c liferay
\dt

Así es como lo hago de todos modos.

Puede combinar esos dos comandos en una sola línea, si lo prefiere:

\c liferay \dt
d11wtq
fuente
2
Realmente quieres \dt *.*si no todas las tablas de interés están en el search_path.
Craig Ringer
10

Para ver las mesas públicas puedes hacer

listas de tablas

\dt

lista de privilegios de tabla, vista y acceso

\dp or \z

o solo los nombres de las tablas

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

En SQL Query, puede escribir este código:

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

Reemplace su esquema de tabla con YOUR_TABLE_SCHEME;

Ejemplo:

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

Para ver todo el esquema y todas las tablas, no hay necesidad de la cláusula where:

select table_name from information_schema.tables
Sevki Kocadag
fuente
1

Un ejemplo de una línea es

\dt schemaname.* 

en tu senario

\dt public.*
mcolak
fuente
0

Esto se puede usar en scripts de automatización si no necesita todas las tablas en todos los esquemas:

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

Puede escribir \?para obtener información sobre todos los comandos admitidos en psql.

Sunil Kumar
fuente