Définir le commentaire d'une colonne sur celui d'une autre colonne dans Postgresql

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

  •  07-07-2019
  •  | 
  •  

Question

Supposons que je crée une table dans Postgresql avec un commentaire sur une colonne:

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

Quelques temps plus tard, je décide d'ajouter une autre colonne:

alter table t1 add column c2 varchar(20);

Je souhaite rechercher le contenu du commentaire de la première colonne et l'associer à la nouvelle colonne:

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

Le (quoi?) sera une table système, mais après avoir jeté un coup d'œil dans pgAdmin et avoir effectué une recherche sur le Web, je n'ai pas appris son nom.

Idéalement, j'aimerais pouvoir:

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

mais j'ai le sentiment que les choses vont un peu loin. Merci pour toutes les idées.

Mise à jour: sur la base des suggestions que j'ai reçues ici, j'ai fini par écrire un programme pour automatiser la tâche de transfert des commentaires, dans le cadre d'un processus plus vaste de modification du type de données d'une colonne Postgresql. Vous pouvez en savoir plus sur sur mon blog .

Était-ce utile?

La solution

La prochaine chose à savoir est de savoir comment obtenir la table oid. Je pense que l’utilisation de cela dans le cadre des commentaires ne fonctionnera pas, comme vous le soupçonnez.

    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)

Quoi qu’il en soit, j’ai créé une fonction plpgsql rapide pour copier les commentaires d’une paire de tables / colonnes à une autre. Vous devez créer createlang plpgsql sur la base de données et l'utiliser comme ceci:

    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;

Autres conseils

Vous pouvez récupérer des commentaires sur les colonnes à l'aide de la fonction système col_description (table_oid, column_number). Voir cette page pour plus de détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top