Existe uma consulta ou comando do PostgreSQL que retorna os nomes dos campos e os tipos de campo de uma consulta, tabela ou visualização?
Por exemplo, uma solução, se aplicada a uma consulta SELECT simples SELECT * from person
, deve retornar uma lista como:
Column Name | Column Type
===========================
First Name | character
Last Name | character
Age | integer
Date of Birth | date
Pesquisei as information_schema
visualizações descritas em uma resposta abaixo e parece cobrir as tabelas muito bem, e suspeito que também cubra as visualizações, mas ainda não verifiquei isso.
A última é qualquer consulta SELECT arbitrária, mas válida, por exemplo, envolvendo, JOINS
, UNIONS
etc, no banco de dados. Existe um procedimento interno ou outro procedimento armazenado ou script que possa retornar o mesmo para qualquer CONSULTA válida?
Estou desenvolvendo um programa que cria dados e formulários de consulta e as informações são necessárias para validação de dados e execução de funções nos dados retornados.
information_schema
vs. catálogos do sistemaJá discutimos isso muitas vezes. O esquema de informação serve a certos propósitos. Os catálogos do sistema são a fonte real de todas as informações.
O esquema de informações fornece visualizações padronizadas que ajudam na portabilidade - principalmente nas principais versões do Postgres, pois a portabilidade em diferentes plataformas RDBMS normalmente é uma ilusão, uma vez que suas consultas são sofisticadas o suficiente para pesquisar catálogos de sistemas. Notavelmente, o Oracle ainda não oferece suporte ao esquema de informações.
As visualizações no esquema de informações devem passar por muitos obstáculos para obter um formato compatível com o padrão. Isso os torna lentos, às vezes muito lentos. Compare planos e desempenho para estes objetos básicos:
A diferença é notável.
Seu exemplo
Para o seu exemplo
SELECT * from tbl
, compare as duas consultas abaixo para esta tabela simples:Usando
pg_attribute
:format_type()
retorna o tipo completo com todos os modificadores:Observe também que a conversão para
regclass
resolve o nome da tabela de acordo com o arquivosearch_path
. Ele gera uma exceção se o nome não for válido. Ver:Usando
information_schema.columns
:As informações são padronizadas, mas incompletas :
Para obter informações completas sobre o tipo de dados, você precisa considerar todas essas colunas adicionalmente:
Respostas relacionadas:
Lista de prós e contras
Os maiores profissionais (IMO) em negrito.
Visualizações do esquema de informações
Catálogos do sistema
oid
incluídas)Consulta arbitrária
Para obter a mesma lista de nomes e tipos de coluna de uma consulta, você pode usar um truque simples:
CREATE
uma tabela temporária da saída da consulta e, em seguida, use as mesmas técnicas acima.Você pode anexar
LIMIT 0
, pois não precisa de dados reais:Para obter o tipo de dados de colunas individuais, você também pode usar a função
pg_typeof()
:Você pode usar o
psql
cliente de linha de comando.\dt
irá mostrar uma lista de tabelas\dv
irá mostrar uma lista de visualizações\d [object_name]
irá descrever o esquema da tabela ou visãoNão tenho certeza de como você descreveria uma consulta.
Mais informações: https://manikandanmv.wordpress.com/tag/basic-psql-commands/
Se você tem acesso ao pg_catalog e usa o PgAdmin3, eu recomendo uma solução que encontrei no blog Valentine's Tech ( http://tech.valgog.com/2011/02/pgadmin-iii-macros-get-table-fields. html ). É uma macro PgAdmin3 que pode ser acessada com um atalho para exibir a definição de um nome de tabela selecionado.
Funciona como um encanto e extremamente útil.
Use as
information_schema
visualizações , elas são padrão SQL e contêm as informações que você deseja.Você também pode acessar diretamente
pg_class
,pg_attribute
, etc, mas isso é não-portável e muitas vezes mais complicado; você pode precisar de funções auxiliares comooidvectortypes
,pg_get_function_arguments
, etc para algumas coisas.Se você quiser ver como
psql
executa algo como\dt
, executepsql -E
- ele imprimirá a consulta. No entanto, geralmente é melhor usar oinformation_schema
se ele atender às suas necessidades.Isso pode ser muito simples, mas pgAdmin4 mostra os tipos de campo nos resultados de saída. As outras soluções acima são provavelmente mais elegantes, mas quando preciso de uma resposta rápida, acho que a GUI de consulta do pgAdmin4 funciona muito bem. Tentar descobrir o tipo de campo de um campo calculado retornado por uma exibição ou função pode ser complicado.