Установка комментария столбца к комментарию другого столбца в Postgresql

StackOverflow https://stackoverflow.com/questions/272438

  •  07-07-2019
  •  | 
  •  

Вопрос

Предположим, я создал таблицу в Postgresql с комментарием к столбцу:

create table t1 (
   c1 varchar(10)
);
comment on column t1.c1 is 'foo';

Через некоторое время я решил добавить еще один столбец:

alter table t1 add column c2 varchar(20);

Я хочу посмотреть содержимое комментариев первого столбца и связать его с новым столбцом:

select comment_text from (what?) where table_name = 't1' and column_name = 'c1'

(Что?) будет системной таблицей, но после просмотра в pgAdmin и поиска в Интернете я не узнал его имени.

В идеале я бы хотел иметь возможность:

comment on column t1.c1 is (select ...);

но у меня есть ощущение, что это немного растягивает вещи. Спасибо за любые идеи.

Обновление: основываясь на полученных мною предложениях, я закончил написание программы для автоматизации задачи передачи комментариев в рамках более крупного процесса изменения типа данных столбца Postgresql. Вы можете прочитать об этом в моем блоге .

Это было полезно?

Решение

Следующее, что нужно знать, это как получить oid таблицы. Я думаю, что использование этого в качестве части комментария не будет работать, как вы подозреваете.

    postgres=# create table comtest1 (id int, val varchar);
    CREATE TABLE
    postgres=# insert into comtest1 values (1,'a');
    INSERT 0 1
    postgres=# select distinct tableoid from comtest1;
     tableoid
    ----------
        32792
    (1 row)

    postgres=# comment on column comtest1.id is 'Identifier Number One';
    COMMENT
    postgres=# select col_description(32792,1);
        col_description
    -----------------------
     Identifier Number One
    (1 row)

Во всяком случае, я включил быструю функцию plpgsql для копирования комментариев из одной пары таблица / столбец в другую. Вы должны создать в базе данных pllangs plpgsql и использовать его следующим образом:

    Copy the comment on the first column of table comtest1 to the id 
    column of the table comtest2. Yes, it should be improved but 
    that's left as work for the reader.

    postgres=# select copy_comment('comtest1',1,'comtest2','id');
     copy_comment
    --------------
                1
    (1 row)
CREATE OR REPLACE FUNCTION copy_comment(varchar,int,varchar,varchar) RETURNS int AS $PROC$
DECLARE
        src_tbl ALIAS FOR $1;
        src_col ALIAS FOR $2;
        dst_tbl ALIAS FOR $3;
        dst_col ALIAS FOR $4;
        row RECORD;
        oid INT;
        comment VARCHAR;
BEGIN
        FOR row IN EXECUTE 'SELECT DISTINCT tableoid FROM ' || quote_ident(src_tbl) LOOP
                oid := row.tableoid;
        END LOOP;

        FOR row IN EXECUTE 'SELECT col_description(' || quote_literal(oid) || ',' || quote_literal(src_col) || ')' LOOP
                comment := row.col_description;
        END LOOP;

        EXECUTE 'COMMENT ON COLUMN ' || quote_ident(dst_tbl) || '.' || quote_ident(dst_col) || ' IS ' || quote_literal(comment);

        RETURN 1;
END;
$PROC$ LANGUAGE plpgsql;

Другие советы

Вы можете получить комментарии к столбцам, используя системную функцию col_description (table_oid, column_number). Смотрите эту страницу для дальнейшие подробности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top