2012-09-16 26 views
101

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

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

He aquí una lista de todos 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=# 

Respuesta

163

Si desea una lista de todos tablas, se debe utilizar:

\dt *.* 

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

Es posible que desee hacer esto mediante programación, en cuyo caso psql comandos de barra invertida no harán el trabajo. Aquí es donde el the INFORMATION_SCHEMA viene al rescate. Para una lista de tablas:

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

Por cierto, si alguna vez quiere ver lo que está haciendo psql en respuesta a un comando de barra invertida, ejecute psql con la bandera -E. por ejemplo:

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

Así se puede ver que está en busca psqlpg_catalog.pg_database cuando se obtiene una lista de bases de datos. Del mismo modo, para las 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 SQL estándar, portátil INFORMATION_SCHEMA en lugar de los catálogos del sistema Pg cuando sea posible, pero a veces se necesita información específica Pg. En esos casos, está bien consultar el system catalogs directamente, y psql -E puede ser una guía útil sobre cómo hacerlo.

+0

¡Guau! Muchas gracias por su BTW. Eso es muy valioso. –

+0

'information_schema.tables' incluye vistas por alguna razón. (En PostgreSQL 9.2, de todos modos.) – jpmc26

+0

@ jpmc26 Sí, con 'table_type = 'VIEW'', por lo que son fáciles de excluir. En general, SQL intenta tratar las vistas de la misma manera que las tablas tanto como sea posible. –

85

Conectar a la base de datos, a continuación, una lista de las tablas:

\c liferay 
\dt 

Así es como lo hago de todos modos.

Se pueden combinar estos dos comandos en una sola línea, si lo prefiere:

\c liferay \dt 
+2

que realmente desea '\ dt * *' si no todas las tablas de interés se encuentran en el 'search_path. '. –

+2

Gracias por '\ c nombre_bd' –

+0

Wow todo lo que obtengo es' No se encontraron relaciones'. – surfer190

4

Para ver las tablas públicas que puede hacer

tablas de listas

\dt 

privilegios lista de tablas, vistas y acceso

\dp or \z 

o sólo los nombres de las tablas

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

En SQL Que ry, puede escribir este código:

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

Reemplazar su esquema de mesa con YOUR_TABLE_SCHEME;

Ejemplo:

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

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

select table_name from information_schema.tables 
-1

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

0

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

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