Existe-t-il une requête ou une commande PostgreSQL qui renvoie les noms de champs et les types de champs d'une requête, d'une table ou d'une vue?
Par exemple, une solution appliquée à une requête SELECT simple comme SELECT * from person
devrait renvoyer une liste comme:
Column Name | Column Type
===========================
First Name | character
Last Name | character
Age | integer
Date of Birth | date
J'ai recherché les information_schema
vues décrites dans une réponse ci-dessous et cela semble assez bien couvrir les tableaux, et je soupçonne que cela couvre également les vues, mais je ne l'ai pas encore vérifié.
Le dernier est tout arbitraire , mais requête valide SELECT impliquant par exemple, JOINS
, UNIONS
etc., sur la base de données. Existe-t-il une procédure intégrée ou une autre procédure stockée ou un script qui peut renvoyer la même chose pour toute QUERY valide?
Je développe un programme qui crée des données et des formulaires de requête et les informations sont nécessaires pour la validation des données et l'exécution de fonctions sur les données retournées.
la source
SELECT
requêtes, c'est-à- dire les requêtes ne définissant pas ou manipulant les données, que ce soit sur des tables, des vues ou d'autres requêtes, retournent des lignes et des colonnes de données, donc PostgreSQL devrait pouvoir renvoyer un liste des noms de colonnes et de leurs types de données. Lesinformation_schema
vues mentionnées ci-dessous dans les réponses semblent y répondre pour les tableaux et les vues. Les requêtes SELECT arbitraires constituent la dernière frontière. Je vais modifier la réponse pour mieux expliquerRéponses:
Schéma d'information vs catalogues système
Nous avons eu des discussions à ce sujet à plusieurs reprises. Le schéma d'information sert à certaines fins. Si vous connaissez votre chemin dans les catalogues système, ceux-ci servent mieux la plupart des objectifs , l'OMI. Les catalogues système sont la véritable source de toutes les informations.
Le schéma d'information fournit des vues standardisées qui facilitent la portabilité, principalement sur les principales versions de Postgres, car la portabilité sur différentes plates-formes SGBDR est généralement une illusion une fois que vos requêtes sont suffisamment sophistiquées pour avoir besoin de rechercher des catalogues système. Et, notamment, Oracle ne prend toujours pas en charge le schéma d'informations.
Les vues dans le schéma d'informations doivent parcourir plusieurs cercles pour obtenir un format conforme à la norme. Cela les rend lents, parfois très lents. Comparez les plans et les performances de ces objets de base:
La différence est remarquable. Cela dépend vraiment de ce que vous recherchez.
Votre exemple
Pour votre exemple
SELECT * from tbl
, comparez les deux requêtes ci-dessous pour ce tableau simple:En utilisant
pg_attribute
:format_type()
renvoie le type complet avec tous les modificateurs:Notez également que le transtypage
regclass
résout le nom de la table de manière quelque peu intelligente en fonction du courantsearch_path
. Il déclenche également une exception si le nom n'est pas valide. Détails:En utilisant
information_schema.columns
:Les informations sont standardisées mais incomplètes :
Pour obtenir des informations complètes sur le type de données, vous devez également prendre en compte toutes ces colonnes:
Réponses associées:
Une liste des avantages et des inconvénients , les plus grands avantages (OMI) en gras:
Vues du schéma d'information
Catalogues système
oid
incluses)Requête arbitraire
Pour obtenir la même liste de noms et types de colonnes à partir d'une requête, vous pouvez utiliser une astuce simple: CRÉER une table temporaire à partir de la sortie de la requête, puis utiliser les mêmes techniques que ci-dessus.
Vous pouvez ajouter
LIMIT 0
, car vous n'avez pas besoin de données réelles:Pour obtenir le type de données de colonnes individuelles, vous pouvez également utiliser la fonction
pg_typeof()
:la source
Vous pouvez utiliser le
psql
client de ligne de commande.\dt
affichera une liste de tableaux\dv
affichera une liste de vues\d [object_name]
décrira le schéma de la table ou de la vueJe ne sais pas comment vous décririez une requête.
Plus d'informations: https://manikandanmv.wordpress.com/tag/basic-psql-commands/
la source
Si vous avez accès au pg_catalog et utilisez PgAdmin3, je recommande fortement une solution que j'ai trouvée sur le blog de Valentine's Tech ( http://tech.valgog.com/2011/02/pgadmin-iii-macros-get-table-fields. html ). Il s'agit d'une macro PgAdmin3 accessible avec un raccourci pour afficher la définition d'un nom de table sélectionné.
Fonctionne comme un charme et extrêmement utile.
la source
Utilisez les
information_schema
vues , elles sont standard SQL et contiennent les informations que vous souhaitez.Vous pouvez également accéder directement
pg_class
,pg_attribute
etc., mais c'est souvent fiddlier et non portable; vous devrez peut-être des fonctions d'aide commeoidvectortypes
,pg_get_function_arguments
, etc pour certaines choses.Si vous voulez voir comment
psql
exécute quelque chose comme\dt
, exécutezpsql -E
- cela imprimera la requête. Cependant, il est généralement préférable d'utiliser leinformation_schema
si cela répond à vos besoins.la source
Cela peut être trop simple, mais pgAdmin4 affiche les types de champs dans les résultats de sortie. Les autres solutions ci-dessus sont probablement plus élégantes, mais lorsque j'ai juste besoin d'une réponse rapide, je trouve que l'interface graphique de requête de pgAdmin4 fonctionne plutôt bien. Essayer de comprendre le type de champ d'un champ calculé renvoyé par une vue ou une fonction peut être délicat.
la source