Estou procurando uma informação precisa em um banco de dados sobre o qual não tenho conhecimento. O banco de dados está em uma máquina separada, mas posso fazer login nele e iniciar uma psql
linha de comando, com direitos de administrador.
É um produto de terceiros e eles demoram a responder perguntas. Eu sei que os dados estão dentro desse banco de dados, então quero fazer um pouco de engenharia reversa.
Dado um nome de tabela, é possível obter uma lista dos nomes das colunas dessa tabela?
Por exemplo, no SQL Server, é possível despejar uma tabela em uma CREATE
instrução reutilizável, que lista textualmente todas as colunas das quais a tabela é composta.
Além da linha de comando que
\d+ <table_name>
você já encontrou, você também pode usar o Esquema de Informações para pesquisar os dados da coluna, usandoinformation_schema.columns
:Nota: Conforme o exemplo acima, certifique-se de que os valores estejam entre aspas.
Como complemento às outras respostas, mesmo uma instrução SELECT que não retorne nenhuma linha irá expor os nomes das colunas para você e para o código do aplicativo.
Eu pretendo que isso seja executável por quase qualquer software cliente para quase qualquer DBMS. ( Quase ? Sim, alguns não suportam uma cláusula como
where false
. Em vez disso, eles exigem uma expressão comowhere 1 = 0
.)As permissões podem entrar em jogo com qualquer uma dessas abordagens.
O esquema de informações é o caminho mais lento e seguro: é padronizado e amplamente portátil para outros bancos de dados que o suportam. E continuará funcionando nas principais versões.
No entanto, as visualizações no esquema de informações geralmente unem muitas tabelas dos catálogos do sistema para atender a um formato estritamente padronizado - muitas das quais são apenas frete morto na maioria das vezes. Isso os torna lentos .
Os desenvolvedores do Postgres não estão fazendo promessas, mas o básico (como o que é necessário aqui) não vai mudar nas versões principais.
Avaliação mais detalhada:
psql
(a interface de linha de comando nativa) toma a via rápida, é claro, e consulta a fonte diretamente. Se você iniciarpsql
com o parâmetro-E
, os comandos SQL por trás de barra invertida como serão\d
exibidos. Ou\set ECHO_HIDDEN on
a partir da linha de comando do psql. A partir daí, você pode construir uma resposta para sua pergunta.Mais rápido do que consultar
information_schema.columns
. TenteEXPLAIN ANALYZE
ver por si mesmo. Ainda dificilmente importa para uma consulta única. Mas pode fazer diferença se usado em uma consulta/função repetida muitas vezes.Há também diferenças sutis na visibilidade. Comparação detalhada:
psql
no PostgreSQL 11+Se estiver procurando os tipos de coluna em uma consulta, você pode usar
psql
's\gdesc
Somente PostgreSQL
Isso é um pouco piegas, mas pode ser um concorrente se você estiver procurando pelo SQL mais curto possível:
ou ainda mais curto (supondo que haja pelo menos uma linha presente na tabela)
A listagem preserva a ordem. Caso você não se importe com o pedido e tenha a
hstore
extensão instalada, você pode fazer ainda mais curto