“show cmets”的主要问题是要记住特定功能的名称、目录名称等以检索评论...或其在指南上的页面。在这个答案中我们通过2种方式解决:
通过总结普通方式(pg-way)来展示cmets;
并通过提供快捷功能,减少“记忆问题”。
pg 方式
最简单的,在psql 上,就是用\dt+ 显示表cmets 和\d+ 显示列cmets。一些用于函数 cmets?
要使用 SQL,并且对于记住所有参数的人来说,pg 方式是使用 obj_description() 函数 (Guide) 和足够的 reg-type:
函数:select obj_description('mySchema.myFunction'::regproc, 'pg_proc')
表格或视图:
(“...以及大多数其他具有列或与表格相似的东西”,guide)
@987654338 @
other 通用:select obj_description('mySchema.myObject'::regName, pg_regName),其中regName 是datatype-oid references Guide 的十分之一,pg_regName 是相同的替换前缀reg通过前缀pg_。
其他具体:类似select obj_description('schema.myObject'::regName, catalog_name),其中catalog_name 更具体地说明catalogs Guide 处的(95 分之一)关键字。它可以减少一些“命名空间污染”。例如,pg_proc 用于函数,pg_aggregate 用于聚合函数。
获取共享数据库对象的评论,模拟但使用函数shobj_description()(相同的page Guide)。
列:select col_description('mySchema.myObject'::regClass, column_number),其中 column_number 是列的序号位置(在 CREATE TABLE 中)。
没有列名...请参阅col_description(table,column_name) 补充以下内容。
重要提示:使用相同的 reg-type 和 _catalog_name_(例如 ::regclass 和 pg_class)似乎是多余的,有时 obj_description('obj'::regObj) 工作正常,只有 reg-类型! ...但是,正如指南所说:
它已被弃用,因为不能保证 OID 在不同的系统目录中是唯一的;因此,可能会返回错误的评论。
获取cmets的快捷键
如果您发现难以记住所有类型转换和参数,最好采用一个新的、最简单的函数来检索 cmets。
CREATE FUNCTION rel_description(
p_relname text, p_schemaname text DEFAULT NULL
) RETURNS text AS $f$
SELECT obj_description((CASE
WHEN strpos($1, '.')>0 THEN $1
WHEN $2 IS NULL THEN 'public.'||$1
ELSE $2||'.'||$1
END)::regclass, 'pg_class');
$f$ LANGUAGE SQL;
-- EXAMPLES OF USE:
-- SELECT rel_description('mytable');
-- SELECT rel_description('public.mytable');
-- SELECT rel_description('otherschema.mytable');
-- SELECT rel_description('mytable', 'otherschema');
-- PS: rel_description('public.mytable', 'otherschema') is a syntax error,
-- but not generates exception: returns the same as ('public.mytable')
我们还需要一些不那么难看的东西来显示列 cmets。没有一种 pg_get_serial_sequence() 函数可以从其名称中获取 列 的序数位置。原生
col_description('mySchema.myObject'::regClass, column_number)
需要补语:
CREATE FUNCTION col_description(
p_relname text, -- table name or schema.table
p_colname text, -- table's column name
p_database text DEFAULT NULL -- NULL for current
) RETURNS text AS $f$
WITH r AS (
SELECT CASE WHEN array_length(x,1)=1 THEN array['public',x[1]] ELSE x END
FROM regexp_split_to_array(p_relname,'\.') t(x)
)
SELECT col_description(p_relname::regClass, ordinal_position)
FROM r, information_schema.columns i
WHERE i.table_catalog = CASE
WHEN $3 IS NULL THEN current_database() ELSE $3
END and i.table_schema = r.x[1]
and i.table_name = r.x[2]
and i.column_name = p_colname
$f$ LANGUAGE SQL;
-- SELECT col_description('tableName','colName');
-- SELECT col_description('schemaName.tableName','colName','databaseName);
注意事项: