【问题标题】:Getting list of table comments in PostgreSQL获取 PostgreSQL 中的表注释列表
【发布时间】:2020-11-08 04:43:51
【问题描述】:

Postgresql 允许将 cmets 添加到表等对象中。例如,我使用以下 SQL 命令向表“mytable”添加了注释:

COMMENT ON TABLE mytable IS 'This is my table.';

我的问题是: 如果我想使用 SQL 命令来获取所有表及其各自的注释 - 我将如何做到这一点?什么是合适的查询?

提前致谢! 干杯!

【问题讨论】:

  • \d+ myta* 将为您提供该信息(* 是通配符)!查看here 以获得更好的寻呼机,如果您运行 psql -E ,发出的每一个命令都会自动打印与之关联的 SQL!

标签: sql postgresql


【解决方案1】:

所有的cmets都存储在pg_description

要获得桌子上的 cmets,您需要将其加入 pg_class

您也可以使用函数obj_description() 来检索此信息:

SELECT obj_description(oid)
FROM pg_class
WHERE relkind = 'r'

编辑

在 psql 中,您可以简单地使用\d+ 命令来显示所有表,包括它们的 cmets。或者使用\dd命令显示系统中的所有cmets

【讨论】:

  • 表名是public.mytable和??在哪里?如何查询(使用 SELECT)表注释?
  • @PeterKrauss:使用:select obj_description('public.mytable'::regclass)
  • 我发现\d+ 没有没有显示表格注释(它显示列 cmets)但\dt+ 确实显示了表格 cmets。
  • @a_horse_with_no_name,首先感谢您分享答案!我注意到 Andrew 的回答适合我的情况,使用 PostgreSQL 9.4.4
  • @a_horse_with_no_name,首先感谢您分享答案!我注意到 Andrew 的回答适合我的情况,使用 PostgreSQL 9.4.4
【解决方案2】:

“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),其中regNamedatatype-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_(例如 ::regclasspg_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); 

注意事项:

  • 正如this answer 所建议的那样:“如果您想知道在处理 \dt+ 或 \d+ 客户时 psql 会运行哪些查询,只需使用 psql -E 启动它”。

  • 可以使用任何multiline string(与E\n$$...$$)来表达多行注释...
    但您不能应用trim() 或使用另一个动态方面.必须在 COMMENT 子句上使用 dynamic SQL

  • 没有 cmets 可看? PostgreSQL 程序员不使用 COMMENT 子句,因为它使用起来很丑:没有语法可以在 CREATE TABLE 或 CREATE FUNCTION 上添加注释;并且没有好的IDE来自动化它。

  • 现代http://postgREST.org/ 界面在Web 上显示cmets!

【讨论】:

  • 你为什么不简单地使用:select obj_description('public.mytable'::regclass, 'pg_class')(或者使用只显示该信息的 SQL 客户端)
  • 嗨@a_horse_with_no_name。关于obj_description()的直接使用,见“pg-way”一节:检索列注释、函数注释等并不简单,记住所有东西很难看……还有其他问题和捷径。现在答案是一个Wiki,您和任何读者 (!) 都可以编辑它并增强答案。
  • JetBrains 的 DataGrip 很好地支持 cmets。
【解决方案3】:

您可以使用pg_catalog.obj_description 函数和information_schema.tables 架构视图:

SELECT t.table_name, pg_catalog.obj_description(pgc.oid, 'pg_class')
FROM information_schema.tables t
INNER JOIN pg_catalog.pg_class pgc
ON t.table_name = pgc.relname 
WHERE t.table_type='BASE TABLE'
AND t.table_schema='public';

FUNCTIONS-INFO-COMMENT-TABLE

INFORMATION_SCHEMA Support in MySQL, PostgreSQL

【讨论】:

    猜你喜欢
    • 2017-09-10
    • 2019-05-09
    • 1970-01-01
    • 2015-11-11
    • 2020-12-31
    • 1970-01-01
    • 2016-09-30
    • 2018-02-06
    • 1970-01-01
    相关资源
    最近更新 更多