我正在Postgres数据库上运行一个项目,需要检索数据库中列的注释,以用作表格标题等.我已经看到有几个内置函数(pg_description和col_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)
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.
如果有人需要它,就在这里。
这里有很多答案,但没有一个像我希望的那样简单。因此,根据以前的答案和当前的 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)
它获取表和列的描述,没有任何令人困惑的连接和丑陋的字符串连接。
注意模式,这段代码考虑它们:
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)
参考文献:
小智 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
对其他答案之一稍作更改,只为您提供对其有评论的列,这将为您提供所有列,无论它们是否有评论。
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???
| 归档时间: |
|
| 查看次数: |
23243 次 |
| 最近记录: |