it-swarm.com.de

Zeigen Sie benutzerdefinierte Typen und deren Details an

Ich habe einige neue UDTs in PostgreSQL erstellt. Jetzt habe ich jedoch zwei Probleme:

  1. wie kann man sehen, welche UDTs definiert wurden?
  2. wie werden die in diesen UDTs definierten Spalten angezeigt?

Leider konnte ich in der PostgreSQL-Dokumentation nichts dazu finden.

12
navige

Fangen Sie damit an?

SELECT n.nspname AS schema,
        pg_catalog.format_type ( t.oid, NULL ) AS name,
        t.typname AS internal_name,
        CASE
            WHEN t.typrelid != 0
            THEN CAST ( 'Tuple' AS pg_catalog.text )
            WHEN t.typlen < 0
            THEN CAST ( 'var' AS pg_catalog.text )
            ELSE CAST ( t.typlen AS pg_catalog.text )
        END AS size,
        pg_catalog.array_to_string (
            ARRAY( SELECT e.enumlabel
                    FROM pg_catalog.pg_enum e
                    WHERE e.enumtypid = t.oid
                    ORDER BY e.oid ), E'\n'
            ) AS elements,
        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;

In psql können Sie \set ECHO_HIDDEN on, damit psql Ihnen die Abfragen zeigt, mit denen die Ausgabe von \d... Befehle. Ich habe festgestellt, dass diese Abfragen als Ausgangspunkt für das Ausgraben von Metadaten aus Datenbanken sehr nützlich sind.

pdate: 16.12.2019

Für zusammengesetzte Typen können die Spaltenmetadaten wie folgt bestimmt werden:

WITH types AS (
    SELECT n.nspname,
            pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
            CASE
                WHEN t.typrelid != 0 THEN CAST ( 'Tuple' AS pg_catalog.text )
                WHEN t.typlen < 0 THEN CAST ( 'var' AS pg_catalog.text )
                ELSE CAST ( t.typlen AS pg_catalog.text )
                END AS obj_type,
            coalesce ( pg_catalog.obj_description ( t.oid, 'pg_type' ), '' ) AS description
        FROM pg_catalog.pg_type t
        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 n.nspname !~ '^pg_toast'
),
cols AS (
    SELECT n.nspname::text AS schema_name,
            pg_catalog.format_type ( t.oid, NULL ) AS obj_name,
            a.attname::text AS column_name,
            pg_catalog.format_type ( a.atttypid, a.atttypmod ) AS data_type,
            a.attnotnull AS is_required,
            a.attnum AS ordinal_position,
            pg_catalog.col_description ( a.attrelid, a.attnum ) AS description
        FROM pg_catalog.pg_attribute a
        JOIN pg_catalog.pg_type t
            ON a.attrelid = t.typrelid
        JOIN pg_catalog.pg_namespace n
            ON ( n.oid = t.typnamespace )
        JOIN types
            ON ( types.nspname = n.nspname
                AND types.obj_name = pg_catalog.format_type ( t.oid, NULL ) )
        WHERE a.attnum > 0
            AND NOT a.attisdropped
)
SELECT cols.schema_name,
        cols.obj_name,
        cols.column_name,
        cols.data_type,
        cols.ordinal_position,
        cols.is_required,
        coalesce ( cols.description, '' ) AS description
    FROM cols
    ORDER BY cols.schema_name,
            cols.obj_name,
            cols.ordinal_position ;
16
gsiems

Sie können die Standard-GUI verwenden pgAdmin :

types in pgAdmin

Stellen Sie sicher, dass die Typen im Objektbrowser aktiviert sind ( Optionen - Browser - Anzeige )

Links sehen Sie benutzerdefinierte Typen im ausgewählten Schema (Frage 1. ).

Das SQL pane rechts hat das rückentwickelte SQL-Skript für den ausgewählten Typ (Frage 2. ).
Weitere Details im Bereich darüber, wie Dependents usw.


Alternativ können Sie die interaktive Standardkonsole psql verwenden:

  1. \dT, um eine Liste der benutzerdefinierten Typen abzurufen.
  2. \d type_name, um die Spaltendefinitionsliste für den angegebenen Typ abzurufen.

Das Handbuch :

\d[S+] [ pattern ]

Für jede Beziehung (Tabelle, Ansicht, materialisierte Ansicht, Index, Sequenz oder Fremdtabelle) oder zusammengesetzten Typ , die dem Muster entspricht , zeige alle Spalten, ihre Typen, [...]

Meine kühne Betonung. Der Befehl funktioniert auch für zusammengesetzte Typen, da mindestens Postgres 9.1.

Und:

\dT[S+] [ pattern ]

Listet Datentypen auf. Wenn Muster angegeben ist, werden nur Typen aufgelistet, deren Namen mit dem Muster übereinstimmen. Wenn + wird an den Befehlsnamen angehängt, jeder Typ wird mit seinem internen Namen und seiner Größe, seinen zulässigen Werten, wenn es sich um einen enum -Typ handelt, und den zugehörigen Berechtigungen aufgelistet. Standardmäßig werden nur vom Benutzer erstellte Objekte angezeigt. Geben Sie ein Muster oder den Modifikator S an, um Systemobjekte einzuschließen.

13

Dies ist eine sehr einfache Alternative, aber genug für einfache Anwendungsfälle. Wenn der Spaltentyp UDT ist, verwenden wir udt_name Spalte von information_schema.columns Tabelle.

select column_name, case 
        when (data_type = 'USER-DEFINED') then udt_name 
        else data_type 
    end as data_type
from information_schema.columns 
where table_schema = 'altimetria' and table_name = 'cnivel';

Ergebnis (geometryist ein UDT):

 column_name  |    data_type     
--------------+------------------
 ogc_fid      | integer
 wkb_geometry | geometry
 id_cnivel    | bigint
 cod_cart     | bigint
 cod_fam      | bigint
 cod_sub      | integer
 z            | double precision
 shape_len    | double precision
1
jgrocha

Versuchen Sie, diesen Code auszuführen:

SELECT
    pg_type.typname, 
     pg_enum.enumlabel
FROM
    pg_type 
JOIN
    pg_enum ON pg_enum.enumtypid = pg_type.oid;
1