获取PostgreSQL中的表注释列表

Bio*_*303 30 sql postgresql

Postgresql允许向表等对象添加注释.例如,我使用此SQL命令向表"mytable"添加了注释:

COMMENT ON TABLE mytable IS 'This is my table.';
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!干杯!

a_h*_*ame 41

所有注释都存储在pg_description中

要获取表的注释,需要将其连接到pg_class

作为替代方案,您还可以使用该函数obj_description()来检索此信息:

SELECT obj_description(oid)
FROM pg_class
WHERE relkind = 'r'
Run Code Online (Sandbox Code Playgroud)

编辑

在psql中,您只需使用该\d+命令即可显示所有表,包括其注释.或使用该\dd命令显示系统中的所有注释

  • @PeterKrauss:使用:`select obj_description('public.mytable':: regclass)` (5认同)
  • 我发现`\ d +`没有显示表注释(它显示列注释),但是\ dt +`显示了表注释。 (2认同)

Ejr*_*085 13

您可以使用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';
Run Code Online (Sandbox Code Playgroud)

功能-信息-注释表

MySQL、PostgreSQL 中的 INFORMATION_SCHEMA 支持


Pet*_*uss 8

“显示评论”的主要问题是记住特定功能的名称、目录名称等以检索评论...或其在指南上的页面。在这个答案中,我们以两种方式解决:
通过总结普通方式(pg-way)来显示评论;
并通过提供快捷功能,减少“记忆问题”。


pg 方式

最简单的,对psql,就是用\dt+显示表的意见和\d+显示专栏评论。一些用于功能注释?

要了解 SQL,并且对于记住所有参数的人,pg 方法是将obj_description()函数 ( Guide ) 与足够的reg类型结合使用:

  • 功能select obj_description('mySchema.myFunction'::regproc, 'pg_proc')

  • 表或视图:(
    “......以及大多数其他具有列或与表相似的所有内容”,指南
    select obj_description('mySchema.myClass'::regclass, 'pg_class')

  • 其他通用:select obj_description('mySchema.myObject'::regName, pg_regName),其中regName是 10分之1 的datatype-oid 引用 Guide,并且pg_regName是相同的,用 prefix 替换regprefix pg_

  • 其他特定的:similar select obj_description('schema.myObject'::regName, catalog_name),其中catalog_name是关于catalogs Guide 中的(1 in 95)关键字更具体的。它可以减少一些“命名空间污染”。例如pg_proc对于函数,pg_aggregate对于聚合函数。

  • 获取共享数据库对象的注释,模拟但使用该函数shobj_description()(同一页指南)。

  • : select col_description('mySchema.myObject'::regClass, column_number),其中column_number是列的序号位置(在 CREATE TABLE 处)。
    没有列名...见col_description(table,column_name)补充波纹管。

重要提示:使用相同的reg -type 和 _catalog_name_(例如 ::regclassand pg_class)似乎是多余的,有时obj_description('obj'::regObj) 工作正常,只有reg -type!...但是,正如指南所说:

它已被弃用,因为不能保证 OID 在不同的系统目录中是唯一的;因此,可能会返回错误的评论。

获取评论的快捷功能

如果你发现很难记住所有的类型转换和参数,最好是采用一个新的和最简单的函数来检索评论。

 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') 
Run Code Online (Sandbox Code Playgroud)

我们还需要一些不那么难看的东西来显示专栏评论。没有任何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); 
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 如此答案所建议的:“如果您想知道在执行 \dt+ 或 \d+ 客户时 psql 运行哪些查询,只需使用psql -E“启动

  • 可以使用任何多行字符串(带有 E\n$$...$$)来表达多行注释……
    但是您不能应用trim()或使用另一个动态方面。必须在COMMENT子句上使用动态 SQL

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

  • 现代http://postgREST.org/界面在网络上显示评论!

  • 为什么不简单地使用:`select obj_description('public.mytable'::regclass, 'pg_class')`(或使用只显示该信息的 SQL 客户端) (5认同)