AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 75015
Accepted
vfclists
vfclists
Asked: 2014-08-27 14:46:36 +0800 CST2014-08-27 14:46:36 +0800 CST 2014-08-27 14:46:36 +0800 CST

Obter nomes de colunas e tipos de dados de uma consulta, tabela ou exibição

  • 772

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_schemavisualizaçõ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, UNIONSetc, 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.

postgresql datatypes
  • 5 5 respostas
  • 151706 Views

5 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2014-08-28T09:36:33+08:002014-08-28T09:36:33+08:00

    information_schemavs. catálogos do sistema

    Já 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:

    EXPLAIN ANALYZE SELECT * from information_schema.columns;
    EXPLAIN ANALYZE SELECT * from pg_catalog.pg_attribute;
    

    A diferença é notável.

    Seu exemplo

    Para o seu exemplo SELECT * from tbl, compare as duas consultas abaixo para esta tabela simples:

    CREATE TEMP TABLE foo(
       a numeric(12,3)
     , b timestamp(0)
    );
    

    Usando pg_attribute:

    SELECT attname, format_type(atttypid, atttypmod) AS type
    FROM   pg_attribute
    WHERE  attrelid = 'foo'::regclass
    AND    attnum > 0
    AND    NOT attisdropped
    ORDER  BY attnum;
    

    format_type()retorna o tipo completo com todos os modificadores:

    attname | type
    --------+-------------------------------
    a       | numeric(12,3)
    b       | timestamp(0) without time zone
    

    Observe também que a conversão para regclassresolve o nome da tabela de acordo com o arquivo search_path. Ele gera uma exceção se o nome não for válido. Ver:

    • ERRO: não foi possível encontrar o tipo de matriz para o tipo de dados information_schema.sql_identifier

    Usando information_schema.columns:

    SELECT column_name, data_type
    FROM   information_schema.columns
    WHERE  table_name = 'foo'
    ORDER  BY ordinal_position;
    

    As informações são padronizadas, mas incompletas :

    column_name | data_type
    ------------+----------------------------
    a           | numeric
    b           | timestamp without time zone
    

    Para obter informações completas sobre o tipo de dados, você precisa considerar todas essas colunas adicionalmente:

    character_maximum_length
    character_octet_length
    numeric_precision
    numeric_precision_radix
    numeric_scale
    datetime_precision
    interval_type
    interval_precision
    

    Respostas relacionadas:

    • Como verificar se uma tabela existe em um determinado esquema
    • Listar todas as colunas de uma tabela especificada

    Lista de prós e contras

    Os maiores profissionais (IMO) em negrito.

    Visualizações do esquema de informações

    • muitas vezes mais simples (depende)
    • lento
    • pré-processados, que podem ou não atender às suas necessidades
    • seletivo (os usuários veem apenas os objetos para os quais têm privilégios)
    • em conformidade com um padrão SQL (que é implementado por alguns dos principais RDBMS)
    • principalmente portátil nas principais versões do Postgres
    • não requer muito conhecimento específico sobre Postgres
    • os identificadores são descritivos, longos e às vezes estranhos

    Catálogos do sistema

    • muitas vezes mais complexo (depende), mais próximo da fonte
    • velozes
    • completo (colunas do sistema como oidincluídas)
    • não está em conformidade com um padrão SQL
    • menos portátil nas principais versões do Postgres (mas o básico não vai mudar)
    • requerem conhecimentos mais específicos sobre o Postgres
    • identificadores são concisos, menos descritivos, mas convenientemente curtos

    Consulta arbitrária

    Para obter a mesma lista de nomes e tipos de coluna de uma consulta, você pode usar um truque simples: CREATEuma 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:

    CREATE TEMP TABLE tmp123 AS
    SELECT 1::numeric, now()
    LIMIT  0;
    

    Para obter o tipo de dados de colunas individuais, você também pode usar a função pg_typeof():

    SELECT pg_typeof(1);
    
    • 33
  2. Neil McGuigan
    2014-08-27T16:38:09+08:002014-08-27T16:38:09+08:00

    Você pode usar o psqlcliente de linha de comando.

    \dtirá mostrar uma lista de tabelas

    \dvirá mostrar uma lista de visualizações

    \d [object_name]irá descrever o esquema da tabela ou visão

    Não tenho certeza de como você descreveria uma consulta.

    Mais informações: https://manikandanmv.wordpress.com/tag/basic-psql-commands/

    • 3
  3. marcopolo
    2019-08-14T02:31:49+08:002019-08-14T02:31:49+08:00

    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.

    select quote_ident(nspname) || '.' || quote_ident(relname) as table_name, 
           quote_ident(attname) as field_name, 
           format_type(atttypid,atttypmod) as field_type, 
           case when attnotnull then ' NOT NULL' else '' end as null_constraint,
           case when atthasdef then 'DEFAULT ' || 
                                    ( select pg_get_expr(adbin, attrelid) 
                                        from pg_attrdef 
                                       where adrelid = attrelid and adnum = attnum )::text else ''
           end as dafault_value,
           case when nullif(confrelid, 0) is not null
                then confrelid::regclass::text || '( ' || 
                     array_to_string( ARRAY( select quote_ident( fa.attname ) 
                                               from pg_attribute as fa 
                                              where fa.attnum = ANY ( confkey ) 
                                                and fa.attrelid = confrelid
                                              order by fa.attnum 
                                            ), ','
                                     ) || ' )'
                else '' end as references_to
      from pg_attribute 
           left outer join pg_constraint on conrelid = attrelid 
                                        and attnum = conkey[1] 
                                        and array_upper( conkey, 1 ) = 1,
           pg_class, 
           pg_namespace
     where pg_class.oid = attrelid
       and pg_namespace.oid = relnamespace
       and pg_class.oid = btrim( '$SELECTION$' )::regclass::oid
       and attnum > 0
       and not attisdropped
     order by attrelid, attnum;
    

    Funciona como um encanto e extremamente útil.

    • 3
  4. Craig Ringer
    2014-08-27T17:34:33+08:002014-08-27T17:34:33+08:00

    Use as information_schemavisualizaçõ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 psqlexecuta algo como \dt, execute psql -E- ele imprimirá a consulta. No entanto, geralmente é melhor usar o information_schemase ele atender às suas necessidades.

    • 1
  5. David A
    2018-07-06T12:20:11+08:002018-07-06T12:20:11+08:00

    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.

    insira a descrição da imagem aqui

    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve