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,