Quindi attualmente sto creando alcuni SQL per leggere i cataloghi di Postgres (9.1) per creare definizioni di tabelle. Tuttavia, sto riscontrando un problema con i tipi di dati SERIAL / BIGSERIAL.
Esempio:
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"
Mi dà il nome del database (db), il nome dello schema (cruft), il nome della tabella (temp), il nome della colonna (id), il valore predefinito (nextval (...)) e il tipo di dati (bigint e int8 .. NOT bigserial) ... Mi rendo conto di poter semplicemente verificare se il valore predefinito era una sequenza, ma non credo che sarebbe accurato al 100% poiché potevo creare manualmente una sequenza e creare una colonna non seriale in cui il valore predefinito era quella sequenza.
Qualcuno ha un suggerimento su come potrei realizzare questo? Nient'altro che verificare il valore predefinito per un nextval (* _ seq)?
Modificato per la soluzione SQL aggiunta qui in caso di TL; DR o nuovi utenti che non hanno familiarità con il 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;