Все это работает oid,
mat=> SELECT c.oid FROM pg_catalog.pg_class c WHERE c.relname = 'customers';
oid
-------
23208
(1 row)
Теперь, у меня есть oid для той таблицы, таким образом, я могу спросить:
mat=> select pg_catalog.obj_description(23208);
obj_description
-------------------
Customers
(1 row)
Затем я могу попросить описание четвертого столбца:
mat=> select pg_catalog.col_description(23208,4);
col_description
-----------------------------------------
Customer codes, CHS, FACTPOST, POWER...
(1 row)
, Если Вы хотите знать, который запросы делают psql
выполненный, когда Вы делаете \dt+
или \d+ customers
, просто выполните его с -E
.
Хорошо, таким образом, я разработал его до градуса...
выбор col_description (идентификатор таблицы, номер столбца)...
т.е.: выберите col_description (36698,2);
, Который работал, но является там более легким способом сделать это, возможно, приносящее все комментарии ко всем столбцам и использующий имя таблицы вместо oid???
Я задал подобный вопрос о комментариях Postgresql в прошлом месяце. Если Вы роете, через который, Вы столкнетесь с некоторым кодом Perl моего блога, который автоматизирует процесс извлечения комментария.
Для вытаскивания имен столбцов таблицы можно использовать что-то как следующее:
select
a.attname as "colname"
,a.attrelid as "tableoid"
,a.attnum as "columnoid"
from
pg_catalog.pg_attribute a
inner join pg_catalog.pg_class c on a.attrelid = c.oid
where
c.relname = 'mytable' -- better to use a placeholder
and a.attnum > 0
and a.attisdropped is false
and pg_catalog.pg_table_is_visible(c.oid)
order by a.attnum
можно тогда использовать tableoid, columnoid кортеж для извлечения комментария каждого столбца (см. мой вопрос).
У меня это работает с использованием базы данных PostBooks 3.2.2:
select cols.column_name,
(select pg_catalog.obj_description(oid) from pg_catalog.pg_class c where c.relname=cols.table_name) as table_comment
,(select pg_catalog.col_description(oid,cols.ordinal_position::int) from pg_catalog.pg_class c where c.relname=cols.table_name) as column_comment
from information_schema.columns cols
where cols.table_catalog='postbooks' and cols.table_name='apapply'
С уважением, Sylnsr
Это ответ немного поздно, но он появился в поиске Google, который я сделал, чтобы исследовать эту проблему. Нам нужны были только описания таблиц, но метод для столбцов будет таким же. Описания столбцов также находятся в таблице pg_description, на которую ссылается objoid.
Добавьте это представление:
CREATE OR REPLACE VIEW our_tables AS
SELECT c.oid, n.nspname AS schemaname, c.relname AS tablename, d.description,
pg_get_userbyid(c.relowner) AS tableowner, t.spcname AS "tablespace",
c.relhasindex AS hasindexes, c.relhasrules AS hasrules, c.reltriggers > 0 AS hastriggers
FROM pg_class c
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace
LEFT JOIN pg_description d ON c.oid = d.objoid
WHERE c.relkind = 'r'::"char";
ALTER TABLE our_tables OWNER TO postgres;
GRANT SELECT, UPDATE, INSERT, DELETE, REFERENCES, TRIGGER ON TABLE our_tables TO postgres;
GRANT SELECT ON TABLE our_tables TO public;
Затем запустите:
SELECT tablename, description FROM our_tables WHERE schemaname = 'public'
Представление - это модифицированная версия представления pg_tables, которая добавляется в столбец описания. Вы также можете обезопасить определение представления, чтобы сделать его одним запросом.