22

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

COMMENT ON DATABASE mydatabase IS 'DB Comment';

但是,得到评论的相反说法是mydatabase什么?

从命令行psql,我可以看到注释以及其他信息作为\l+命令的结果;我可以在 awk 的帮助下使用它来实现我的目标。但如果可能的话,我宁愿使用 SQL 语句。

4

5 回答 5

42

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

SELECT description
FROM   pg_description
WHERE  objoid = 'myschema.mytbl'::regclass;

架构部分是可选的。如果你省略它,你的 currentsearch_path决定了任何名为mytbl.

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

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

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

表说明:

SELECT obj_description('myschema.mytbl'::regclass, 'pg_class');

数据库说明:

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

你怎么知道的?

好吧,阅读优秀的手册很有启发性。:)
但是在这种情况下有一条更直接的路线:大多数psql元命令都是用纯 SQL 实现的。开始一个会话,看看窗帘背后的魔力。手册:psql -E

-E
--echo-hidden

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

于 2012-07-15T23:25:39.700 回答
15

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

select description from pg_shdescription
join pg_database on objoid = pg_database.oid
where datname = '<database name>'

此查询将为您提供给定表名的表注释:

select description from pg_description
join pg_class on pg_description.objoid = pg_class.oid
where relname = '<your table name>'

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

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>'
于 2012-07-15T18:08:06.590 回答
1

对于表,请尝试

\dd TABLENAME

这显示了我添加到表格中的评论

于 2016-06-01T16:58:04.997 回答
0

此查询将只获得所有表的表注释

SELECT RelName,Description 
FROM pg_Description
JOIN pg_Class 
ON pg_Description.ObjOID = pg_Class.OID
WHERE ObjSubID = 0
于 2014-06-12T07:21:42.403 回答
0

此查询将返回表的注释

 SELECT obj_description('public.myTable'::regclass)
 FROM pg_class
 WHERE relkind = 'r' limit 1
于 2018-01-16T06:19:44.550 回答