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.
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.
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')
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;
Liste de tous définis par Vos types:
\dT
testDB=> \dT
List of data types
Schema | Name | Description
--------+-------------------------+-------------
public | myType |
(1 row)
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 +| | |
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;
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