web-dev-qa-db-fra.com

Comment lister les types personnalisés en utilisant Postgres information_schema

J'essaie de trouver le code SQL équivalent de\dT en utilisant le code information_schema et n'arrive pas à trouver quoi que ce soit. Est-ce qu'une telle chose existe?

Exemple: si j'ajoute l'énumération de type personnalisé suivante, comment puis-je la voir dans le schéma d'information?

CREATE TYPE communication.channels AS ENUM
   ('text_message',
    'email',
    'phone_call',
    'broadcast');

NOTE: J'ai le code SQL exact utilisé par\dT (récupéré en ouvrant la journalisation), mais je recherche spécifiquement une implémentation plus propre utilisant la structure information_schema.

33
Collin Peters

Les énumérations ne sont pas dans le standard SQL et ne sont donc pas représentées dans le schéma d'information. Les autres types définis par l'utilisateur seraient normalement dans la vue user_defined_types, mais ce n'est pas implémenté. Donc, pour le moment, vous ne pouvez pas utiliser le schéma d'information pour lister les types définis par l'utilisateur dans PostgreSQL.

8
Peter Eisentraut

Pour référence, voici le code SQL de\dT (pgAdmin utilise le même ou similaire)

SELECT      n.nspname as schema, t.typname as type 
FROM        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 NOT IN ('pg_catalog', 'information_schema')
41
Collin Peters

C'est un moyen simple de répertorier tous les types définis enum dans la base de données actuelle. Le résultat de la requête renvoie deux colonnes, la première affiche le nom de chaque type enum, la seconde affiche le nom de chaque valeur pour chaque type enum:

 SELECT pg_type.typname AS enumtype, 
     pg_enum.enumlabel AS enumlabel
 FROM pg_type 
 JOIN pg_enum 
     ON pg_enum.enumtypid = pg_type.oid;
15
Guido

Liste de tous définis par Vos types:

\dT

testDB=> \dT
               List of data types
 Schema |          Name           | Description 
--------+-------------------------+-------------
 public | myType                  | 
(1 row)
7
andrew

Répertoriez tous les types de base de données:

test=# \dT
             List of data types
 Schema |        Name         | Description
--------+---------------------+-------------
 public | gender              |
 public | status              |

Répertorie tous les types de base de données avec des informations supplémentaires telles que des valeurs

test=# \dT+
                                                   List of data types
 Schema |        Name         |    Internal name    | Size |     Elements      | Owner | Access privileges | Description
--------+---------------------+---------------------+------+-------------------+-------+-------------------+-------------
 public | gender              | gender              | 4    | male             +| Vadim |                   |
        |                     |                     |      | female            |       |                   |
 public | status              | status              | 4    | processing       +| Vadim |                   |
        |                     |                     |      | passed           +|       |                   |
        |                     |                     |      | failed            |       |                   |

Obtenez certain type avec des informations supplémentaires:

leps=# \dT+ gender
                                            List of data types
 Schema |  Name  | Internal name | Size | Elements | Owner | Access privileges | Description
--------+------------+---------------+------+-------------------+-------+-------------------+-------------
 public | gender | gender        | 4    | male    +| Vadim |                   |
        |        |               |      | female  +|       |                   |
6
Vadim Shvetsov

J'utilise une vue pour afficher mes noms enum. Les données de cette vue peuvent donc être utilisées dans une application pour fournir une liste des options disponibles pour un champ enum.

CREATE OR REPLACE VIEW vw_enums AS
SELECT t.typname, e.enumlabel, e.enumsortorder
FROM pg_enum e
JOIN pg_type t ON e.enumtypid = t.oid;
3
MikeM

Regardez ici: http://www.postgresql.org/docs/current/static/catalog-pg-enum.html

Le catalogue pg_enum devrait contenir les données que vous recherchez

0
DrColossos