Como faço para listar todas as colunas de uma tabela especificada

Estou procurando informações precisas em um banco de dados sobre o qual não tenho conhecimento.

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

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

Por exemplo no SqlServer, é possível despejar uma tabela em um declarações, que listam textualmente todas as colunas das quais a tabela é composta.

Comentários

  • Que tipo de acesso você tem para o banco de dados?
  • @dezso, está em uma máquina separada, mas posso entrar nele e iniciar a linha de comando do psql, com direitos de administrador
  • Se bem entendi, você estão depois de \dt[+] table_name em psql.
  • nope. \ dt + doesn t parecem exibir explicitamente o nome das colunas. ele apenas adiciona um campo " Descrição ".
  • mas \ d + o nome da tabela funciona!

Resposta

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

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

Observação: conforme o exemplo acima, certifique-se de que os valores estejam entre aspas.

Comentários

  • No psql, use \x on ou \pset expanded on para fazer a consulta resultados lineares (em vez de tabulares) e, portanto, mais fáceis de ler stackoverflow.com/a/9605093/513397
  • Nas versões atuais (tentei em 9.6) você pode fazer em psql \d+ public.* para obter a descrição (esquema + indeces / fkeys / triggers) de todas as suas tabelas e visualizações no public esquema. Nós o usamos em nosso script de gancho pré-commit para acompanhar no git as mudanças no banco de dados feitas por cada commit.
  • SELECT column_name para obter apenas o nome da coluna

Resposta

Como complemento às outras respostas, mesmo uma instrução SELECT que não retorna nenhuma linha 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.

Comentários

  • Presumo que você queira passar esse SQL para o comando psql. Eu sugiro usar a opção –no-psqlrc nesse caso para evitar surpresas na saída.
  • Exceto para as colunas ocultas, que tiveram que ser especificadas para serem selecionadas (como pg_class.oid)

Resposta

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

No entanto, as views no esquema de informações costumam se juntar muitas tabelas dos catálogos do sistema para atender estritamente formato padronizado – muitos dos quais são apenas cargas mortas na maioria das vezes. Isso os torna lentos .
Os desenvolvedores do Postgres não estão fazendo promessas, mas no básico (como o que é necessário aqui) não vai mudar nas versões principais.

psql (a interface de linha de comando nativa) pega a via rápida, é claro, e consulta a fonte diretamente . Se você iniciar psql com o parâmetro -E , o SQL por trás comandos de barra invertida como \d são exibidos. Ou \set ECHO_HIDDEN on na linha de comando do psql. A partir daí, você pode construir uma resposta à sua pergunta.

Dada uma tabela, é possível ter uma lista dos nomes das colunas para este 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 do que consultar information_schema.columns . Experimente EXPLAIN ANALYZE para ver por si mesmo. Ainda dificilmente importa para uma consulta única. Mas pode fazer diferença se usado em uma consulta / função que é repetida muitas vezes.

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

Comentários

  • Gostou muito que você mostrou -E e mostrou às pessoas como obter o sql do psql.
  • Eu concordo.Fiz alguns testes de velocidade e o pg_catalog é executado mais de 2x mais rápido

Resposta

psql no PostgreSQL 11+

Se estiver procurando os tipos de coluna em uma consulta, você pode usar psql “s \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) 

Resposta

Somente PostgreSQL

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

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

ou ainda mais curto (assumindo 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 lista 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

SELECT skeys(hstore(NULL::schema_name.table_name)) 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *