Como listar todas as colunas para uma tabela especificada

293

Estou procurando uma informação precisa em um banco de dados que não conheço.

É um produto de terceiros, eles demoram para responder a algumas perguntas e eu sei que os dados estão dentro desse banco de dados, então eu quero fazer um pouco de engenharia retro.

Em uma tabela, é possível ter uma lista dos nomes das colunas para esta tabela?

Por exemplo, no SqlServer, é possível despejar uma tabela em CREATEinstruções reutilizáveis , que lista textualmente todas as colunas das quais a tabela é composta.

Stephane Rolland
fonte
Que tipo de acesso você tem no banco de dados?
Dezső
@dezso, é em uma máquina independente, mas pode entrar em-lo e lançar linha de comando psql, com direitos de administrador
Stephane Rolland
6
Se eu entendi corretamente, você está depois \dt[+] table_nameem psql.
Dez13
1
Não. \ dt + não parece exibir explicitamente o nome das colunas. ele adiciona apenas um campo "Descrição".
precisa saber é o seguinte
12
mas \ d + nome da tabela funciona!
Stephane Rolland

Respostas:

344

Além da linha de comando que \d+ <table_name>você já encontrou, você também pode usar o Esquema de Informações para procurar os dados da coluna, usando information_schema.columns:

SELECT *
  FROM information_schema.columns
 WHERE table_schema = 'your_schema'
   AND table_name   = 'your_table'
     ;

Nota: Conforme o exemplo acima, verifique se os valores estão entre aspas.

bhamby
fonte
2
Em psql, use \x onou \pset expanded onpara tornar os resultados da consulta linear (em vez de tabular) e, portanto, mais fácil de ler stackoverflow.com/a/9605093/513397
anishpatel
4
Nas versões atuais (tentei na 9.6), você pode fazer no psql \d+ public.*para obter a descrição (esquema + indeces / fkeys / triggers) de todas as suas tabelas e visualizações no publicesquema. Nós o usamos em nosso script de gancho pré-confirmação para acompanhar as mudanças no banco de dados feitas por cada confirmação.
Thalis K.
4
SELECT column_name para obter apenas o nome da coluna
Andrew
82

Como um complemento para as outras respostas, mesmo uma instrução SELECT que não retorna linhas irá expor os nomes das colunas para você e para o código do aplicativo.

select *
from table_name
where false;

As permissões podem entrar em jogo com qualquer uma dessas abordagens.

Mike Sherrill 'Recolha de Gatos'
fonte
Presumo que você pretenda passar esse SQL para o comando psql. Sugiro usar a opção --no-psqlrc nesse caso para evitar surpresas na saída.
precisa saber é o seguinte
Exceto pelas colunas ocultas, que precisavam ser especificadas para serem selecionadas (como pg_class.oid)
okutane
71

O esquema de informações é lento e seguro: é padronizado e amplamente portável para outros bancos de dados que o suportam. E continuará trabalhando nas principais versões.

No entanto, as visualizações no esquema de informações geralmente se juntam a 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 mudará nas principais versões.

psql(a interface da linha de comando nativa) toma a pista rápida, é claro, e consulta a fonte diretamente. Se você começar psqlcom o parâmetro-E , o SQL atrás dos comandos de barra invertida como \dserá exibido. Ou a \set ECHO_HIDDEN onpartir da linha de comando psql. A partir daí, você pode criar uma resposta para sua pergunta.

Em uma tabela, é possível ter uma lista dos nomes das colunas para esta tabela.

SELECT attrelid::regclass AS tbl
     , attname            AS col
     , atttypid::regtype  AS datatype
       -- more attributes?
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass  -- table name, optionally schema-qualified
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

Mais rápido que consultarinformation_schema.columns . Tente EXPLAIN ANALYZEver por si mesmo. Ainda dificilmente importa para uma consulta única. Mas pode fazer a diferença se usado em uma consulta / função repetida várias vezes.

Também existem diferenças sutis na visibilidade. Comparação detalhada:

Erwin Brandstetter
fonte
2
Realmente assim, você mostra a você -Ee mostra às pessoas como obter o sql do psql.
Evan Carroll
6

psql no PostgreSQL 11+

Se você estiver procurando os tipos de coluna em uma consulta, poderá usar psqlos\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)
Evan Carroll
fonte
0

Apenas PostgreSQL

Isso é um tanto obsceno, mas pode ser um candidato se você estiver procurando pelo menor SQL possível:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

ou até mais curto (supondo que haja pelo menos uma linha presente na tabela)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

A listagem preserva o pedido. Caso você não se importe com o pedido e tenha a hstoreextensão instalada, você pode fazer ainda mais

SELECT skeys(hstore(NULL::schema_name.table_name))
oᴉɹǝɥɔ
fonte