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
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 nopublic
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))
\dt[+] table_name
empsql
.