Gibt es eine Möglichkeit, eine benutzerdefinierte postgresql-Aufzählungstypdefinition anzuzeigen?

73

Angenommen, wir haben einen Postgresql-Typ definiert:

CREATE TYPE my_type AS ENUM('foo', 'bar');

Gibt es eine Möglichkeit, die Typdefinition nach der Erstellung anzuzeigen?

Ich würde erwarten, dass "\ d my_type" mir "ENUM ('foo', 'bar')" zeigt, aber es heißt:

Did not find any relation named "my_type"

Die Tabelle pg_type scheint nicht genügend Informationen zu enthalten.

Stéphane
quelle

Antworten:

95

Es ist \ dT, nach dem Sie suchen, aber es gibt es nicht als "CREATE" -Anweisung. Sie verwenden \ dD für Domänen.

\dT+ action.action_status
                          List of data types
 Schema |         Name         | Internal name | Size | Elements | Description 
--------+----------------------+---------------+------+----------+-------------
 action | action.action_status | action_status | 4    | pending +| 
        |                      |               |      | live    +| 
        |                      |               |      | done    +| 
        |                      |               |      | notdone  | 
(1 row)
Richard Huxton
quelle
1
Ich verstehe die Relevanz von "Sie verwenden \ dD für Domains" nicht.
Faheem Mitha
2
Domänen und Typen sind verschiedene Dinge. Sie verwenden \ dD für Domänen und \ dT für Typen.
Richard Huxton
4
OK, ich verstehe. "Eine Domäne ist im Wesentlichen ein Datentyp mit optionalen Einschränkungen (Einschränkungen für den zulässigen Wertesatz)."
Faheem Mitha
14
Ich brauchte ein bisschen, um zu erkennen, dass ich wirklich wollte \dT+ my_enum;.
Gylaz
103

Überprüfen Sie dies:

select enum_range(null::my_type)

Ich denke das ist eine viel einfachere Lösung :).

Adam111p
quelle
1
Ich mag dieses wegen seiner Einfachheit. Die am besten bewerteten funktionieren auf jeden Fall ... aber diese auch. :)
PRS
Ich mag diesen. Die \ d-Syntax funktionierte nicht in dbeaver oder pgadmin, aber das reine SQL in Portable
Darren
Funktioniert in PostgreSQL 8.3.11
Yzmir Ramirez
Was tippe ich anstatt, null:my_typewenn meine Tabelle aufgerufen wird usersund die Spalte statusund der Aufzählungstyp sind enum_user_status? Ich habe alle denkbaren Kombinationen ausprobiert, aber nichts bekommen.
Exebook
@exebook Ich bin viel zu spät, aber ich habe verwendet null::enum_user_status(offensichtlich habe ich meinen Aufzählungsnamen anstelle von verwendet enum_user_status). Die Tabelle / Spalte, in der die Aufzählung verwendet wird, war nicht beteiligt.
Dano
13

Wenn Sie nur den vollständigen Namen (Typname und Schema) und eine sortierte Liste aller enumBeschriftungen wünschen , führt diese Abfrage Folgendes aus:

SELECT n.nspname AS "schema", t.typname
     , string_agg(e.enumlabel, '|' ORDER BY e.enumsortorder) AS enum_labels
FROM   pg_catalog.pg_type t 
JOIN   pg_catalog.pg_namespace n ON n.oid = t.typnamespace 
JOIN   pg_catalog.pg_enum e ON t.oid = e.enumtypid  
WHERE  t.typname = 'my_enum_type'
GROUP  BY 1,2;

Kehrt zurück:

 schema | typname      | enum_labels
--------+--------------+-------------
 public | my_enum_type | foo|bar

string_agg()erfordert Postgres 9.0 oder höher, ersetzen durch array_agg()für ältere Versionen.


Um die SQL- CREATEAnweisung abzurufen , können Sie die Speicherauszugsdatei verwenden pg_dumpund anzeigen.

Oder, viel praktischer, verwenden Sie pgAdmin, das Reverse Engineered SQL-Erstellungsskripte für jedes Objekt in der Datenbank anzeigt. Wählen Sie es im aus object browserund sein Erstellungsskript wird im angezeigt SQL pane. Es besteht sogar die Möglichkeit, das Skript SQL editorautomatisch in ein neu geöffnetes Fenster des zu kopieren , wo Sie es bearbeiten und ausführen können.

Erwin Brandstetter
quelle
2
Beachten Sie, dass Sie die Anzeigetypen pgAdminstandardmäßig aktivieren müssen: Datei → Optionen → Browser und Überprüfen Types.
Eugene Yarmash
Ab Version 1.18.1 finden Sie diese Option unter Datei -> Optionen -> Anzeige.
Mohamad Mehdi Kharatizadeh
1
SELECT t.typname
FROM pg_class c JOIN pg_attribute a ON c.oid = a.attrelid JOIN pg_type t ON a.atttypid = t.oid
WHERE c.relname = 'your_type';

Der schwierige Teil war, dass man durch einfaches Auswählen von * aus diesen Ansichten keine OIDs in den Ergebnissen erhält.

dezso
quelle