我最近发现你可以attach a comment加入PostgreSQL中的所有类型的对象。特别是,我有兴趣玩数据库的评论。例如,要设置数据库的注释:
COMMENT ON DATABASE mydatabase IS 'DB Comment';
然而,对于获取 mydatabase
的评论,相反的说法是什么?
从psql
命令行,我可以看到评论以及\l+
命令导致的其他信息;我可以借助awk来实现我的目标。但是如果可能的话,我宁愿使用SQL语句。
答案 0 :(得分:34)
首先,您可以使用强制转换为适当的object identifier type来简化对表注释的查询:
SELECT description
FROM pg_description
WHERE objoid = 'myschema.mytbl'::regclass;
架构部分是可选的。如果省略它,您当前的search_path
会决定任何名为mytbl
的表格的可见性。
更好,PostgreSQL中有专用函数来简化和规范这些查询。 The manual:
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
开始会话,看看窗帘背后的魔力。 The manual:
-E
--echo-hidden
回显
\d
和其他反斜杠命令生成的实际查询。您可以使用它来研究psql的内部操作。这个 相当于将变量ECHO_HIDDEN
设置为on
。
答案 1 :(得分:12)
要获取有关数据库的注释,请使用以下查询:
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>'
答案 2 :(得分:1)
对于表格,请尝试
file:///var/mobile/Containers/Data/Application/B2A1EE50-D800-4BB0-B475-6C7F210C913C/Documents/2016-06-01%2021:49:32
这显示我添加到表格中的评论
答案 3 :(得分:0)
此查询将仅获取所有表的表注释
SELECT RelName,Description
FROM pg_Description
JOIN pg_Class
ON pg_Description.ObjOID = pg_Class.OID
WHERE ObjSubID = 0
答案 4 :(得分:0)
此查询将返回表的注释
SELECT obj_description('public.myTable'::regclass)
FROM pg_class
WHERE relkind = 'r' limit 1