Recuperando Comentários de um PostgreSQL DB

votos
25

Estou executando um projeto em um banco de dados Postgres e precisa recuperar os comentários sobre colunas dentro da DB para ser usado como cabeçalhos de tabela e tal. Tenho visto que há um par de construído em funções ( pg_description e col_description ), mas eu não tenho sido capaz de encontrar exemplos de como usá-los e brincar com eles provou muito fútil.

Então eu queria saber se algum tem sido capaz de fazer isso antes e se sim, como?

Publicado 05/12/2008 em 08:39
fonte usuário
Em outras línguas...                            


13 respostas

votos
1

Ok, então eu trabalhei para fora para grau ...

selecione col_description (id mesa, número da coluna) ...

isto é: col_description seleccione (36698,2);

Isso funcionou, mas existe uma maneira mais fácil de fazer isso talvez trazendo todos os comentários sobre todas as colunas e usando o nome da tabela em vez do oid ???

Respondeu 05/12/2008 em 08:45
fonte usuário

votos
11

Tudo funciona por OID,

mat=> SELECT c.oid FROM pg_catalog.pg_class c WHERE c.relname = 'customers';
  oid  
-------
 23208
(1 row)

Agora, eu tenho o OID para essa tabela, então eu posso perguntar:

mat=> select pg_catalog.obj_description(23208);
  obj_description  
-------------------
 Customers
(1 row)

Então, eu posso pedir a descrição da quarta coluna:

mat=> select pg_catalog.col_description(23208,4);
             col_description             
-----------------------------------------
 Customer codes, CHS, FACTPOST, POWER...
(1 row)

Se você quiser saber quais consultas não psqlexecutar quando você faz \dt+ou \d+ customers, basta executá-lo com -E.

Respondeu 05/12/2008 em 08:51
fonte usuário

votos
1

Cool, que trabalha para trazer um único comentário, mas há uma maneira para abrir todos os comentários de todas as colunas sem várias instruções SELECT ou um loop?

E como você lançar este com uma declaração:

Se você quiser saber quais consultas faz psql prazo, quando você faz \ dt + ou \ d + clientes, apenas launche com -E.

obrigado

Respondeu 05/12/2008 em 09:12
fonte usuário

votos
0

Perguntei a uma pergunta semelhante sobre os comentários PostgreSQL no mês passado. Se você cavar através disso, você vai se deparar com algum código Perl mais no meu blog que automatiza o processo de extrair um comentário.

Para retirar os nomes de coluna de uma tabela, você pode usar algo como o seguinte:

select
     a.attname  as "colname"
    ,a.attrelid as "tableoid"
    ,a.attnum   as "columnoid"
from
    pg_catalog.pg_attribute a
    inner join pg_catalog.pg_class c on a.attrelid = c.oid
where
        c.relname = 'mytable' -- better to use a placeholder
    and a.attnum > 0
    and a.attisdropped is false
    and pg_catalog.pg_table_is_visible(c.oid)
order by a.attnum

Você pode então usar o tableoid, tuple columnoid para extrair o comentário de cada coluna (ver a minha pergunta).

Respondeu 08/12/2008 em 22:41
fonte usuário

votos
4

Isso funciona para mim usando as PostBooks 3.2.2 DB:

select cols.column_name,
(select pg_catalog.obj_description(oid) from pg_catalog.pg_class c where c.relname=cols.table_name) as table_comment
,(select pg_catalog.col_description(oid,cols.ordinal_position::int) from pg_catalog.pg_class c where c.relname=cols.table_name) as column_comment
from information_schema.columns cols
where cols.table_catalog='postbooks' and cols.table_name='apapply'

Regards, Sylnsr

Respondeu 06/07/2009 em 20:18
fonte usuário

votos
0

Esta resposta é um pouco tarde, mas apareceu em uma pesquisa no Google eu fiz para pesquisar este problema. Nós só precisava de descrições de mesa, mas o método seria o mesmo para colunas. As descrições das colunas estão na tabela pg_description também, referenciado por objoid.

Adicionar este ponto de vista:


CREATE OR REPLACE VIEW our_tables AS 
 SELECT c.oid, n.nspname AS schemaname, c.relname AS tablename, d.description,
   pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS "tablespace", 
   c.relhasindex AS hasindexes, c.relhasrules AS hasrules, c.reltriggers > 0 AS hastriggers
   FROM pg_class c
   LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
   LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
   LEFT JOIN pg_description d ON c.oid = d.objoid
  WHERE c.relkind = 'r'::"char";

ALTER TABLE our_tables OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT IGNORE , DELETE, REFERENCES, TRIGGER ON TABLE our_tables TO postgres;
GRANT SELECT ON TABLE our_tables TO public;

Então corra:

SELECT tablename, description FROM our_tables WHERE schemaname = 'public'

A vista é uma versão modificada da vista pg_tables que acrescenta na coluna descrição. Você poderia também monkey ao redor com a definição vista a torná-lo uma única consulta.

Respondeu 23/07/2009 em 19:13
fonte usuário

votos
26
SELECT c.table_schema,c.table_name,c.column_name,pgd.description
FROM pg_catalog.pg_statio_all_tables as st
  inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid)
  inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position
    and  c.table_schema=st.schemaname and c.table_name=st.relname);
Respondeu 09/02/2011 em 15:38
fonte usuário

votos
2

Melhore para @ Nick e @mat sugestões: usar
SELECT obj_description('schemaName.tableName'::regclass, 'pg_class'); quando você tem nome string (não OID).

Para evitar a lembrar parâmetro 'pg_class', e para evitar concatenations feias nas chamadas de função, como (tname||'.'||schema)::regclass, uma sobrecarga útil para obj_description:

  CREATE FUNCTION obj_description(
      p_rname text, p_schema text DEFAULT NULL, 
      p_catalname text DEFAULT 'pg_class'
  ) RETURNS text AS $f$
     SELECT obj_description((CASE 
        WHEN strpos($1, '.')>0 OR $2 IS NULL OR $2='' THEN $1
        ELSE $2||'.'||$1
     END)::regclass, $3);
  $f$ LANGUAGE SQL IMMUTABLE;
 -- USAGE: obj_description('mytable') 
 --        SELECT obj_description('s.t'); 
 -- PS: obj_description('s.t', 'otherschema') is a syntax error, 
 --     but not generates exception: returns the same as ('s.t') 

Agora é fácil de usar, porque o nome da tabela ( rnameparâmetro) é um varchar e pode ser expressa com um campo separado para nome do esquema , como nas principais tabelas e consultas.

Consulte "também lista Obtendo dos comentários de tabela no PostgreSQL " ou o novo Guia pg9.3

Respondeu 08/10/2012 em 11:26
fonte usuário

votos
8

Tome cuidado com esquemas, este código considerá-los:

SELECT
    cols.column_name,
    (
        SELECT
            pg_catalog.col_description(c.oid, cols.ordinal_position::int)
        FROM
            pg_catalog.pg_class c
        WHERE
            c.oid = (SELECT ('"' || cols.table_name || '"')::regclass::oid)
            AND c.relname = cols.table_name
    ) AS column_comment
FROM
    information_schema.columns cols
WHERE
    cols.table_catalog    = 'your_database'
    AND cols.table_name   = 'your_table'
    AND cols.table_schema = 'your_schema';

Referências:

Respondeu 21/03/2014 em 00:55
fonte usuário

votos
2

Só para ficar aqui, se alguém vai precisar dele.

Há muitas respostas aqui, mas nenhum deles era tão simples como eu gostaria que fosse. Assim, com base em respostas anteriores e postgres atuais 9.4, eu criei esta consulta:

SELECT 
    obj_description(format('%s.%s',isc.table_schema,isc.table_name)::regclass::oid, 'pg_class') as table_description,
    pg_catalog.col_description(format('%s.%s',isc.table_schema,isc.table_name)::regclass::oid,isc.ordinal_position) as column_description
FROM
    information_schema.columns isc

Ele busca descrições de tabelas e colunas, sem qualquer confuso junta e concatenations cordas feias.

Respondeu 04/03/2015 em 07:30
fonte usuário

votos
0

Eu só descobri isso aqui. Ele irá fornecer-lhe todo o tipo de metadados em uma tabela específica (tipo, valor padrão, não flag nula, comprimento, comentário, nome da chave estrangeira, nome da chave principal). Isso parece funcionar bem.

SELECT pg_tables.tablename, pg_attribute.attname AS field, 
    format_type(pg_attribute.atttypid, NULL) AS "type", 
    pg_attribute.atttypmod AS len,
    (SELECT col_description(pg_attribute.attrelid, 
            pg_attribute.attnum)) AS comment, 
    CASE pg_attribute.attnotnull 
        WHEN false THEN 1  ELSE 0  
    END AS "notnull", 
    pg_constraint.conname AS "key", pc2.conname AS ckey, 
    (SELECT pg_attrdef.adsrc FROM pg_attrdef 
        WHERE pg_attrdef.adrelid = pg_class.oid 
        AND pg_attrdef.adnum = pg_attribute.attnum) AS def 
FROM pg_tables, pg_class 
JOIN pg_attribute ON pg_class.oid = pg_attribute.attrelid 
    AND pg_attribute.attnum > 0 
LEFT JOIN pg_constraint ON pg_constraint.contype = 'p'::"char" 
    AND pg_constraint.conrelid = pg_class.oid AND
    (pg_attribute.attnum = ANY (pg_constraint.conkey)) 
LEFT JOIN pg_constraint AS pc2 ON pc2.contype = 'f'::"char" 
    AND pc2.conrelid = pg_class.oid 
    AND (pg_attribute.attnum = ANY (pc2.conkey)) 
WHERE pg_class.relname = pg_tables.tablename  
--    AND pg_tables.tableowner = "current_user"() 
    AND pg_attribute.atttypid <> 0::oid  
    AND tablename='your_table' 
ORDER BY field ASC

Fonte: http://golden13.blogspot.de/2012/08/how-to-get-some-information-about_7.html

Respondeu 22/09/2015 em 13:09
fonte usuário

votos
0

I acessada comentários tabela como esta:

select c.relname table_name, pg_catalog.obj_description(c.oid) as comment from pg_catalog.pg_class c where c.relname = 'table_name';

e comentários de coluna assim:

SELECT c.column_name, pgd.description FROM pg_catalog.pg_statio_all_tables as st inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid) inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position and c.table_schema=st.schemaname and c.table_name=st.relname and c.table_name = 'table_name' and c.table_schema = 'public');
Respondeu 23/10/2017 em 14:17
fonte usuário

votos
0

Uma pequena mudança para uma das outras respostas que só lhe dá colunas que têm comentários sobre eles, isto dá-lhe todas as colunas se eles têm um comentário ou não.

select c.table_schema, st.relname as TableName, c.column_name, 
pgd.description
from pg_catalog.pg_statio_all_tables as st
inner join information_schema.columns c
on c.table_schema = st.schemaname
and c.table_name = st.relname
left join pg_catalog.pg_description pgd
on pgd.objoid=st.relid
and pgd.objsubid=c.ordinal_position
where st.relname = 'YourTableName';
Respondeu 23/04/2018 em 15:39
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more