如何检索PostgreSQL数据库的注释?

C2H*_*5OH 18 postgresql

我最近发现你可以在PostgreSQL中为所有类型的对象添加注释.特别是,我有兴趣玩数据库的评论.例如,要设置数据库的注释:

COMMENT ON DATABASE mydatabase IS 'DB Comment';
Run Code Online (Sandbox Code Playgroud)

然而,相反的说法是什么,得到评论mydatabase

psql命令行中,我可以看到其他资料的结果一起注释\l+命令; 我可以借助awk来实现我的目标.但是如果可能的话,我宁愿使用SQL语句.

Erw*_*ter 35

首先,可以使用强制转换为适当的对象标识符类型简化对表注释的查询:

SELECT description
FROM   pg_description
WHERE  objoid = 'myschema.mytbl'::regclass;
Run Code Online (Sandbox Code Playgroud)

架构部分是可选的.如果省略它,则当前search_path决定任何名为的表的可见性mytbl.

更好的是,PostgreSQL中有专门的函数来简化和规范这些查询.手册:

obj_description(object_oid,...获取数据库对象的注释catalog_name)

shobj_description(object_oid,...获取共享数据库对象的注释catalog_name)

表说明:

SELECT obj_description('myschema.mytbl'::regclass, 'pg_class');
Run Code Online (Sandbox Code Playgroud)

数据库说明:

SELECT pg_catalog.shobj_description(d.oid, 'pg_database') AS "Description"
FROM   pg_catalog.pg_database d
WHERE  datname = 'mydb';
Run Code Online (Sandbox Code Playgroud)

你怎么知道的?

那么,阅读优秀的手册是有启发性的.:)
但是在这种情况下有一个更直接的路由:大多数psql元命令都是用纯SQL实现的.开始一个会议,看看幕后的魔力.手册:psql -E

-E
--echo-hidden

回显由\d其他反斜杠命令生成的实际查询.您可以使用它来研究psql的内部操作.这相当于将变量设置ECHO_HIDDENon.

  • 我不知道“psql -E”,可能是因为读 psql 手册页太快了。谢谢。 (2认同)

mar*_*tin 11

要获取有关数据库的注释,请使用以下查询:

select description from pg_shdescription
join pg_database on objoid = pg_database.oid
where datname = '<database name>'
Run Code Online (Sandbox Code Playgroud)

此查询将获取给定表名的表注释:

select description from pg_description
join pg_class on pg_description.objoid = pg_class.oid
where relname = '<your table name>'
Run Code Online (Sandbox Code Playgroud)

如果在不同的模式中使用相同的表名,则需要稍微修改一下:

select description from pg_description
join pg_class on pg_description.objoid = pg_class.oid
join pg_namespace on pg_class.relnamespace = pg_namespace.oid
where relname = '<table name>' and nspname='<schema name>'
Run Code Online (Sandbox Code Playgroud)

  • @CraigRinger:我在答案中描述的专用函数在任何情况下都会继续工作. (2认同)
  • **对于列注释**必须使用`pg_description.objsubid`:`select c.table_name,c.column_name,c.ordinal_position,d.objsubid,d.description from pg_description d join information_schema.columns c on(c .table_schema = current_schema和current_schema ||'.'|| c.table_name):: regclass = d.objoid和c.ordinal_position = d.objsubid)` (2认同)