Sto provando a fare la stessa cosa, assicurarsi che esista un tipo.
ho iniziato psql con l'opzione --echo-hidden
(-E
) ed è entrato \dT
:
$ psql -E
psql (9.1.9)
testdb=> \dT
********* QUERY **********
SELECT n.nspname as "Schema",
pg_catalog.format_type(t.oid, NULL) AS "Name",
pg_catalog.obj_description(t.oid, 'pg_type') as "Description"
FROM pg_catalog.pg_type t
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
WHERE (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid))
AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid)
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND pg_catalog.pg_type_is_visible(t.oid)
ORDER BY 1, 2;
**************************
List of data types
Schema | Name | Description
--------+------------------+-------------
public | errmsg_agg_state |
(1 row)
Se si sta utilizzando schemi e search_path (Io sono) allora avrete probabilmente bisogno di mantenere il controllo pg_catalog.pg_type_is_visible(t.oid)
. Non so quali siano le condizioni del WHERE, ma non sembrano rilevanti per il mio caso. Attualmente utilizzando:
SELECT 1 FROM pg_catalog.pg_type as t
WHERE typname = 'mytype' AND pg_catalog.pg_type_is_visible(t.oid);
Sapete che non è possibile eliminare o sostituire un tipo se è ancora utilizzato da un tavolo? –
Nel caso in cui si desideri evitare ERRORE in una transazione per un tipo già creato in un precedente tentativo di transazione non riuscita, è sempre possibile DROP TYPE IF EXISTS appena prima dell'istruzione di creazione. – Campa