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.

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)

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 :).


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.