</head>
Obteniendo un listado de tablas, columnas y tipo de datos de un PostgreSQL
Hoy me encontraba trabajando para un proyecto propio, en el cual tengo que interactuar con un sistema legacy (+10 años) montado sobre un servidor de base de datos PostgreSQL.
Como se pueden imaginar, el esquema de la base de datos no es muy amigable, los nombres de las columnas poco descriptivos, y las foreing keys cuasi inexistentes.
Para sumarle complejidad el desarrollo lo estoy haciendo a distancia, por lo que la comunicación con el departamento de sistemas es escueta y por mail. Por lo que para simplificar la misma decidí hacer una especie de “diccionario de datos”, en el cual pienso documentar el esquema de la DB y el significado de cada tabla y campo.
Para hacer esto me topé con que en internet fue difícil encontrar un query SQL que me diera esta información, así que luego de una pequeña renegada pude solucionar, teniendo este SQL como output:
SELECT c.relname as "Table", a.attname as "Column", pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype" FROM pg_catalog.pg_attribute a INNER JOIN pg_catalog.pg_class c ON a.attrelid = c.oid LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE a.attnum > 0 AND NOT a.attisdropped AND n.nspname = 'public' ORDER BY c.relname ASC, a.attname ASC, pg_catalog.format_type(a.atttypid, a.atttypmod) ASC
Que nos dará como resultado algo como:
La consulta no esta optimizada, pero a mi me sirvió, quizás a alguno de ustedes le sirva como está o con algún que otro WHERE más.
Saludos,
| Print article | This entry was posted by Walter Poch on 01/19/2010 at 11:45 PM, and is filed under SQL. Follow any responses to this post through RSS 2.0. You can leave a response or trackback from your own site. |

about 1 month ago
Saludos cordiales, me ha servido de gran forma,,estaba también buscando en la web(no hay información clara)
Muchas gracias,,
about 1 month ago
Utilizando tu código, hice unos cambios para solo listar las tablas(ademas de las tablas que posee parece q también enlista las claves primarias), agrego el codigo modificado:
SELECT distinct
c.relname as Table
FROM
pg_catalog.pg_attribute a
INNER JOIN pg_catalog.pg_class c ON a.attrelid = c.oid
inner JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE
a.attnum > 0
AND NOT a.attisdropped
AND n.nspname = ‘public’
and substring(c.relname,char_length(c.relname)-2,3)’_pk’
ORDER BY
c.relname ASC
about 1 month ago
no sé que paso:
substring(c.relname,char_length(c.relname)-2,3)’_pk’
about 1 month ago
and substring(c.relname,char_length(c.relname)-2,3)”diferente”‘_pk’