Así que actualmente estoy creando algunos SQL para leer los catálogos de postgres (9.1) para construir definiciones de tabla. Sin embargo, me encuentro con un problema con los tipos de datos SERIAL / BIGSERIAL.
Ejemplo:
CREATE TABLE cruft.temp ( id BIGSERIAL PRIMARY KEY );
SELECT * FROM information_schema.columns WHERE table_schema='cruft' AND table_name='temp';
"db","cruft","temp","id",1,"nextval('cruft.temp_id_seq'::regclass)","NO","bigint",,,64,2,0,,,,,,,,,,,,,"db","pg_catalog","int8",,,,,"1","NO","NO",,,,,,,"NEVER",,"YES"
Me da el nombre de la base de datos (db), el nombre del esquema (cruft), el nombre de la tabla (temp), el nombre de la columna (id), el valor predeterminado (nextval (...)) y el tipo de datos (bigint e int8 ... NO bigserial) ... Me doy cuenta de que podría verificar si el valor predeterminado era una secuencia, pero no creo que sea 100% preciso ya que podría crear manualmente una secuencia y crear una columna no serial donde el valor predeterminado era esa secuencia
¿Alguien tiene alguna sugerencia sobre cómo podría lograr esto? ¿Algo más que verificar el valor predeterminado para un nextval (* _ seq)?
Editado para la solución SQL agregada aquí en caso de TL; DR o nuevos usuarios que no están familiarizados con el pg_catalog:
with sequences as (
select oid, relname as sequencename from pg_class where relkind = 'S'
) select
sch.nspname as schemaname, tab.relname as tablename, col.attname as columnname, col.attnum as columnnumber, seqs.sequencename
from pg_attribute col
join pg_class tab on col.attrelid = tab.oid
join pg_namespace sch on tab.relnamespace = sch.oid
left join pg_attrdef def on tab.oid = def.adrelid and col.attnum = def.adnum
left join pg_depend deps on def.oid = deps.objid and deps.deptype = 'n'
left join sequences seqs on deps.refobjid = seqs.oid
where sch.nspname != 'information_schema' and sch.nspname not like 'pg_%' -- won't work if you have user schemas matching pg_
and col.attnum > 0
and seqs.sequencename is not null -- TO ONLY VIEW SERIAL/BIGSERIAL COLUMNS
order by sch.nspname, tab.relname, col.attnum;