Saltar al contenido

Obtener la lista de comentarios de la tabla en PostgreSQL

Encontramos el resultado a esta duda, al menos eso pensamos. Si presentas interrogantes puedes dejarlo en el apartado de preguntas, para nosotros será un placer responderte

Solución:

Todos los comentarios se almacenan en pg_description

Para obtener los comentarios en una tabla, debe unirse a pg_class

Como alternativa, también puede utilizar la función obj_description() para recuperar esta información:

SELECT obj_description(oid)
FROM pg_class
WHERE relkind = 'r'

Editar

En psql puede simplemente usar el d+ comando para mostrar todas las tablas, incluidos sus comentarios. O usa el dd comando para mostrar todos los comentarios en el sistema

El principal problema con “mostrar comentarios” es recordar el nombre de funciones específicas, nombres de catálogos, etc. para recuperar el comentario… O sus páginas en la Guía. En esta respuesta resolvemos de 2 maneras:
por un resumen de la forma ordinaria (el pg-way) para mostrar comentarios;
y al ofrecer funciones de acceso directo, para reducir el “problema de recordar”.


el pg-way

los más simpleen psqles usar dt+ para mostrar los comentarios de la tabla y d+ para mostrar los comentarios de la columna. ¿Algunos para comentarios de funciones?

Para ingresar a SQL, y para las personas que recuerdan todos los parámetros, la pg-way es usar el obj_description() (Guía) junto con la adecuada registro-escribe:

  • Función: select obj_description('mySchema.myFunction'::regproc, 'pg_proc')

  • Tabla o Vista:
    (“… y casi todo lo demás que tiene columnas o es similar a una tabla”, guía)
    select obj_description('mySchema.myClass'::regclass, 'pg_class')

  • otro genérico: select obj_description('mySchema.myObject'::regName, pg_regName)donde regName es 1 de cada 10 de la guía de referencias datatype-oid, y pg_regNombre es lo mismo reemplazando prefix reg por prefix pg_.

  • otro específico: similar select obj_description('schema.myObject'::regName, catalog_name)donde nombre_catálogo es ser más específico sobre un (1 en 95) key-palabra en Guía de catálogos. Puede reducir algo de “contaminación del espacio de nombres”. Por ejemplo pg_proc para funciones, pg_aggregate para funciones agregadas.

  • para obtener un comentario para un objeto de base de datos compartidaanalógico pero usando la función shobj_description() (Misma página Guía).

  • Columna: select col_description('mySchema.myObject'::regClass, column_number)donde número_columna es la posición ordinal de la columna (en CREATE TABLE).
    Sin nombre de columna… Ver col_description(table,column_name) complemento abajo.

IMPORTANTE: el uso de los mismos registro-type y _catalog_name_ (p. ej. ::regclass y pg_class) parece redundante y a veces obj_description('obj'::regObj) funciona bien, con solo registro-¡escribe! … Pero, como dice la Guía:

está en desuso ya que no hay garantía de que los OID sean únicos en los diferentes catálogos del sistema; por lo tanto, es posible que se devuelva un comentario incorrecto.

Funciones de acceso directo para obtener comentarios

si le resulta difícil recordar todos los tipos y parámetros, lo mejor es adoptar una función nueva y más simple para recuperar comentarios.

 CREATE FUNCTION rel_description(
     p_relname text, p_schemaname text 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') 

También necesitamos algo menos feo para mostrar los comentarios de las columnas. no hay ningún tipo de pg_get_serial_sequence() función para obtener la posición ordinal de un columna de su nombre. El nativo
col_description('mySchema.myObject'::regClass, column_number)
necesita un complemento:

 CREATE FUNCTION col_description(
    p_relname text,  -- table name or schema.table 
    p_colname text,   -- table's column name
    p_database text DEFAULT NULL -- NULL for current
 ) RETURNS text AS $f$
    WITH r AS (
      SELECT CASE WHEN array_length(x,1)=1 THEN array['public',x[1]] ELSE x END
      FROM regexp_split_to_array(p_relname,'.') t(x)
     ) 
    SELECT col_description(p_relname::regClass, ordinal_position)
    FROM r, information_schema.columns i
    WHERE i.table_catalog = CASE 
        WHEN $3 IS NULL THEN current_database() ELSE $3 
      END and i.table_schema  = r.x[1]
      and i.table_name    = r.x[2]
      and i.column_name = p_colname
 $f$ LANGUAGE SQL;
 -- SELECT col_description('tableName','colName'); 
 -- SELECT col_description('schemaName.tableName','colName','databaseName); 

NOTAS:

  • Como lo recomienda esta respuesta: “Si desea saber qué consultas ejecuta psql cuando realiza dt+ o d+ clientes, simplemente inícielo con psql -E“.

  • Es posible expresar un comentario multilínea, usando cualquier multilínea string (con min o $$...$$)…
    Pero no puedes aplicar trim() o utilizar otro aspecto dinámico. Debe usar SQL dinámico en la cláusula COMMENT para ello.

  • No hay comentarios para ver? Los programadores de PostgreSQL no usan la cláusula COMMENT porque es feo de usar: no hay sintaxis para agregar comentarios en CREAR TABLA o en CREAR FUNCIÓN; y no hay un buen IDE para automatizarlo.

  • ¡La moderna interfaz http://postgREST.org/ muestra comentarios en la Web!

Reseñas y valoraciones del tutorial

Recuerda algo, que tienes la opción de interpretar si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *