Onde o PostgreSQL armazena a estrutura das tabelas (information_schema, columns, key_column_usage, table_constraints)?
O PostgreSQL armazena a estrutura das tabelas (também chamados de metadados) em um schema especial chamado information_schema.
O information_schema contém várias tabelas com quase todas as definições e configurações do PostgreSQL. De cadastro de usuários, configurações de tabelas, permissões de usuários, etc.
Para descobrir dados sobre as colunas de uma tabela:
SELECT *FROM information_schema.columns;
Informações mais completas sobre uma tabela pode ser obtida assim:
SELECT *FROM information_schema.columns cols LEFT JOIN information_schema.key_column_usage kcu ON kcu.table_schema = cols.table_schema AND kcu.table_name = cols.table_name AND kcu.column_name = cols.column_name LEFT JOIN information_schema.table_constraints tco ON kcu.constraint_name = tco.constraint_name AND kcu.constraint_schema = tco.constraint_schema WHERE cols.table_schema = 'seu_schema' AND cols.table_name = 'nome_da_tabela';
Nessa consulta são usadas as tabelas
information_schema.columns
information_schema.key_column_usage
information_schema.table_constraints
Essa outra tabela também dis informações interessantes sobre as constraints:
SELECT *FROM information_schema.constraint_column_usage;
Referências
Como listar as foreign keys de uma tabela?
https://stackoverflow.com/questions/1152260/how-to-list-table-foreign-keys