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 psql
es 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)
donderegName
es 1 de cada 10 de la guía de referencias datatype-oid, y pg_regNombre es lo mismo reemplazando prefixreg
por prefixpg_
. -
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 ejemplopg_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… Vercol_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 mi
n
o$$...$$
)…
Pero no puedes aplicartrim()
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.