我最近发现您可以在 PostgreSQL 中为所有类型的对象附加注释。特别是,我对玩数据库的评论很感兴趣。例如,要设置数据库的注释:
COMMENT ON DATABASE mydatabase IS 'DB Comment';
但是,得到评论的相反说法是mydatabase
什么?
从命令行psql
,我可以看到注释以及其他信息作为\l+
命令的结果;我可以在 awk 的帮助下使用它来实现我的目标。但如果可能的话,我宁愿使用 SQL 语句。
我最近发现您可以在 PostgreSQL 中为所有类型的对象附加注释。特别是,我对玩数据库的评论很感兴趣。例如,要设置数据库的注释:
COMMENT ON DATABASE mydatabase IS 'DB Comment';
但是,得到评论的相反说法是mydatabase
什么?
从命令行psql
,我可以看到注释以及其他信息作为\l+
命令的结果;我可以在 awk 的帮助下使用它来实现我的目标。但如果可能的话,我宁愿使用 SQL 语句。
首先,可以使用强制转换为适当的对象标识符类型来简化对表注释的查询:
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_HIDDEN
为on
。
要获取有关数据库的评论,请使用以下查询:
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>'
对于表,请尝试
\dd TABLENAME
这显示了我添加到表格中的评论
此查询将只获得所有表的表注释
SELECT RelName,Description
FROM pg_Description
JOIN pg_Class
ON pg_Description.ObjOID = pg_Class.OID
WHERE ObjSubID = 0
此查询将返回表的注释
SELECT obj_description('public.myTable'::regclass)
FROM pg_class
WHERE relkind = 'r' limit 1