2008-12-05 5 views
24

Я запускаю проект в базе данных Postgres и должен получать комментарии к столбцам внутри БД, которые будут использоваться в качестве заголовков таблиц и т. Д. Я видел, что есть несколько встроенных функций (pg_description и col_description), но я не смог найти примеры того, как их использовать, а игра с ними оказалась довольно бесполезной.Получение комментариев из PostgreSQL DB

Так что мне было интересно, если кто-нибудь смог это сделать раньше, и если да, то как?

+0

PostgreSQL не очень дружелюбно, но это происходит потому, что каждый у пользователя есть личная (нестандартная) «библиотека использования». Ниже функции (`rel_description`) моей библиотеки, которая может вам помочь. – 2012-10-08 10:33:16

ответ

1

Итак, я работал его до степени ...

выберите col_description (идентификатор таблицы, номер столбца) ...

т.е. выберите col_description (36698,2);

Это сработало, но есть ли более простой способ сделать это, возможно, принести все комментарии ко всем столбцам и использовать имя таблицы вместо oid ???

11

Это все произведения подъязычная,

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.

+0

«obj_description (object_oid)» теперь устарел, см. Https://www.postgresql.org/docs/current/static/functions-info.html – alfonx 2017-07-20 16:38:00

1

Прохладный, что работает, чтобы вызвать один комментарий, но есть ли способ вызвать все комментарии из всех столбцов без нескольких операторов выбора или цикла?

А как вы запустите это с утверждением:

Если вы хотите знать, какие запросы делает Psql бег, когда вы делаете \ дт + или \ d + клиенты, просто launche его -E.

Благодаря

0

Я спросил a similar question about Postgresql comments в прошлом месяце. Если вы выкапываете это, вы столкнетесь с некоторым кодом 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 кортеж извлечь комментарий каждого столбца (см мой вопрос) ,

4

Это работает для меня с помощью PostBooks 3.2.2 DB:

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

+0

Это работает, но небольшая заметка из документов Postgres: однопараметрическая Форма obj_description требует только OID объекта. Теперь он устарел, поскольку нет никакой гарантии, что OID уникальны в разных системных каталогах; поэтому неверный комментарий может быть возвращен. – 2013-01-23 15:13:08

0

Этот ответ немного поздно, но он выскочил на поиск 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 просмотра, который добавляет в колонке описания. Вы также можете обезьяна обойтись с определением вида, чтобы сделать его одним запросом.

25
SELECT c.table_schema,c.table_name,c.column_name,pgd.description 
FROM pg_catalog.pg_statio_all_tables as st 
    inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid) 
    inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position 
    and c.table_schema=st.schemaname and c.table_name=st.relname); 
+1

Я не совсем понимаю, как работает этот код, но делает то, что мне нужно, поэтому мне не нужно. – ssc 2011-11-22 09:29:53

2

Enhance для @Nick и @mat предложений: использовать
SELECT obj_description('schemaName.tableName'::regclass, 'pg_class'); , когда у вас есть имя строки (не подъязычная).

Чтобы избежать помнить параметр «pg_class», и избежать некрасивых конкатенации на вызовы функций, так как (tname||'.'||schema)::regclass, полезная перегрузку obj_description:

CREATE FUNCTION obj_description(
     p_rname text, p_schema text DEFAULT NULL, 
     p_catalname text DEFAULT 'pg_class' 
) RETURNS text AS $f$ 
    SELECT obj_description((CASE 
     WHEN strpos($1, '.')>0 OR $2 IS NULL OR $2='' THEN $1 
     ELSE $2||'.'||$1 
    END)::regclass, $3); 
    $f$ LANGUAGE SQL IMMUTABLE; 
-- USAGE: obj_description('mytable') 
--  SELECT obj_description('s.t'); 
-- PS: obj_description('s.t', 'otherschema') is a syntax error, 
--  but not generates exception: returns the same as ('s.t') 

Теперь проста в использовании, так как имя таблицы (rname параметр) является varchar и может быть выражен с выделенным полем для имя схемы, как в основных таблицах и запросах.

Смотрите также "Getting list of table comments in PostgreSQL" или new pg9.3 Guide

8

Позаботьтесь со схемами, этот код рассмотрим их:

SELECT 
    cols.column_name, 
    (
     SELECT 
      pg_catalog.col_description(c.oid, cols.ordinal_position::int) 
     FROM 
      pg_catalog.pg_class c 
     WHERE 
      c.oid = (SELECT ('"' || cols.table_name || '"')::regclass::oid) 
      AND c.relname = cols.table_name 
    ) AS column_comment 
FROM 
    information_schema.columns cols 
WHERE 
    cols.table_catalog = 'your_database' 
    AND cols.table_name = 'your_table' 
    AND cols.table_schema = 'your_schema'; 

Ссылки:

+1

Следующая строка допускает большую гибкость в именах таблиц: `` `c.oid = (SELECT ('"' || cols.table_name || '"') :: regclass :: oid) AND``` – jcristovao 2015-02-11 14:39:01

2

Просто быть здесь, если кому-то это понадобится.

Здесь есть много ответов, но ни один из них не был таким простым, как хотелось бы. Так, на основе предыдущих ответов и текущего Postgres 9.4, я создал этот запрос:

SELECT 
    obj_description(format('%s.%s',isc.table_schema,isc.table_name)::regclass::oid, 'pg_class') as table_description, 
    pg_catalog.col_description(format('%s.%s',isc.table_schema,isc.table_name)::regclass::oid,isc.ordinal_position) as column_description 
FROM 
    information_schema.columns isc 

Он извлекает таблицы и столбцы описания, без какого-либо запутанное присоединяется и уродливые конкатенации строк.

0

Я только что нашел это здесь. Он предоставит вам все виды метаданных в одной конкретной таблице (тип, значение по умолчанию, а не нулевой флаг, длина, комментарий, имя внешнего ключа, имя первичного ключа). Кажется, это хорошо работает.

SELECT pg_tables.tablename, pg_attribute.attname AS field, 
    format_type(pg_attribute.atttypid, NULL) AS "type", 
    pg_attribute.atttypmod AS len, 
    (SELECT col_description(pg_attribute.attrelid, 
      pg_attribute.attnum)) AS comment, 
    CASE pg_attribute.attnotnull 
     WHEN false THEN 1 ELSE 0 
    END AS "notnull", 
    pg_constraint.conname AS "key", pc2.conname AS ckey, 
    (SELECT pg_attrdef.adsrc FROM pg_attrdef 
     WHERE pg_attrdef.adrelid = pg_class.oid 
     AND pg_attrdef.adnum = pg_attribute.attnum) AS def 
FROM pg_tables, pg_class 
JOIN pg_attribute ON pg_class.oid = pg_attribute.attrelid 
    AND pg_attribute.attnum > 0 
LEFT JOIN pg_constraint ON pg_constraint.contype = 'p'::"char" 
    AND pg_constraint.conrelid = pg_class.oid AND 
    (pg_attribute.attnum = ANY (pg_constraint.conkey)) 
LEFT JOIN pg_constraint AS pc2 ON pc2.contype = 'f'::"char" 
    AND pc2.conrelid = pg_class.oid 
    AND (pg_attribute.attnum = ANY (pc2.conkey)) 
WHERE pg_class.relname = pg_tables.tablename 
-- AND pg_tables.tableowner = "current_user"() 
    AND pg_attribute.atttypid <> 0::oid 
    AND tablename='your_table' 
ORDER BY field ASC 

Источник: http://golden13.blogspot.de/2012/08/how-to-get-some-information-about_7.html

0

Я обращался табличные комментарии, как это:

select c.relname table_name, pg_catalog.obj_description(c.oid) as comment from pg_catalog.pg_class c where c.relname = 'table_name'; 

столбцов и комментарии Thusly:

SELECT c.column_name, pgd.description FROM pg_catalog.pg_statio_all_tables as st inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid) inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position and c.table_schema=st.schemaname and c.table_name=st.relname and c.table_name = 'table_name' and c.table_schema = 'public'); 

 Смежные вопросы

  • Нет связанных вопросов^_^