Получение списка комментариев в PostgreSQL
Postgresql позволяет добавлять комментарии к таким объектам, как таблицы. Например, я добавил комментарий к таблице "mytable", используя эту команду SQL:
COMMENT ON TABLE mytable IS 'This is my table.';
Мой вопрос:
Если я хочу использовать SQL-команду для получения всех таблиц вместе с их соответствующим комментарием - как бы я это сделал? Каким будет подходящий запрос для этого?
Спасибо заранее!
Ура!
Ответы
Ответ 1
Все комментарии хранятся в pg_description
Чтобы получить комментарии к таблице, вам необходимо присоединиться к ней pg_class
В качестве альтернативы вы также можете использовать функцию obj_description()
для получения этой информации:
SELECT obj_description(oid)
FROM pg_class
WHERE relkind = 'r'
Edit
В psql вы можете просто использовать команду \d+
, чтобы показать все таблицы, включая их комментарии. Или используйте команду \dd
, чтобы показать все комментарии в системе
Ответ 2
Я использую полезный псевдоним (façade) для obj_description
, который прост в использовании, потому что имя таблицы (relname
) является varchar и может быть выражено разделенным полем для имени схемы, как в основные таблицы и запросы.
CREATE FUNCTION rel_description(
p_relname varchar, p_schemaname varchar 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')
ПРИМЕЧАНИЯ:
-
Прозвучит комментарий с именем таблицы, а не с идентификатором OID... "Как получить комментарий с именем таблицы?"
SELECT obj_description ('schemaName.tableName':: regclass, 'pg_class');
-
about obj_description только с object_oid (например, 393862), obj_description(393862)
, он устарел, правильный
SELECT obj_description (393862, 'pg_class');
-
Как рекомендовано этим ответом: "Если вы хотите узнать, какие запросы выполняются psql, когда вы делаете клиентов \dt + или \d +, просто запустите его с psql -E
".
PS: благодаря @a_horse_with_no_name.