从PostgreSQL数据库中检索注释

29 postgresql metadata

我正在Postgres数据库上运行一个项目,需要检索数据库中列的注释,以用作表格标题等.我已经看到有几个内置函数(pg_descriptioncol_description),但我无法找到如何使用它们的例子,并且使用它们已经证明是徒劳的.

所以我想知道是否有人能够做到这一点,如果是这样,怎么样?

小智 36

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);
Run Code Online (Sandbox Code Playgroud)

  • 我不太明白这段代码是如何工作的,但它确实是我需要的,所以我没有必要. (2认同)
  • `pg_statio_all_tables` 是重型视图,因此不要使用它来检索列描述。很好的解决方案是“TZ”的回答。 (2认同)

mat*_*mat 13

这一切都是由oid工作的,

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

现在,我有那张桌子的oid,所以我可以问:

mat=> select pg_catalog.obj_description(23208);
  obj_description  
-------------------
 Customers
(1 row)
Run Code Online (Sandbox Code Playgroud)

然后,我可以要求第四栏的描述:

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

如果您想知道在psql执行时运行了哪些查询,\dt+或者\d+ customers只是运行它-E.


T.Z*_*.Z. 9

如果有人需要它,就在这里。

这里有很多答案,但没有一个像我希望的那样简单。因此,根据以前的答案和当前的 postgres 9.4,我创建了这个查询:

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
Run Code Online (Sandbox Code Playgroud)

它获取表和列的描述,没有任何令人困惑的连接和丑陋的字符串连接。


Mar*_*ato 8

注意模式,这段代码考虑它们:

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';
Run Code Online (Sandbox Code Playgroud)

参考文献:


Dev*_*hon 7

如果您只需要显示comments其他数据中的列,您还可以使用:

\d+ my_table
Run Code Online (Sandbox Code Playgroud)


小智 6

这对我使用 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'
Run Code Online (Sandbox Code Playgroud)

问候, Sylnsr


Dat*_*ter 6

对其他答案之一稍作更改,只为您提供对其有评论的列,这将为您提供所有列,无论它们是否有评论。

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';
Run Code Online (Sandbox Code Playgroud)


小智 0

好吧,所以我已经达到了一定程度......

选择 col_description(表 ID, 列号)...

即:选择 col_description(36698,2);

这可行,但是有没有更简单的方法来做到这一点,也许可以将所有注释都放在所有列上,并使用表名而不是 oid???