Je suis donc en train de créer du SQL pour lire les catalogues postgres (9.1) pour construire des définitions de table. Cependant, je rencontre un problème avec les types de données SERIAL / BIGSERIAL.
Exemple:
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"
Il me donne le nom de la base de données (db), le nom du schéma (cruft), le nom de la table (temp), le nom de la colonne (id), la valeur par défaut (nextval (...)) et le type de données (bigint et int8 .. PAS bigserial) ... Je me rends compte que je pouvais simplement vérifier si la valeur par défaut était une séquence - mais je ne pense pas que ce serait précis à 100% car je pourrais créer manuellement une séquence et créer une colonne non série où la valeur par défaut était cette séquence.
Quelqu'un at-il une suggestion sur la façon dont je pourrais accomplir cela? Autre chose que de vérifier la valeur par défaut pour un nextval (* _ seq)?
Modifié pour la solution SQL ajoutée ici en cas de TL; DR ou de nouveaux utilisateurs peu familiers avec le 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;