human
Je recherche une information précise dans une base de données dont je n'ai aucune connaissance. La base de données est sur une machine séparée, mais je peux m'y connecter et lancer une commande ```psql``` en tant qu'administrateur.
C'est un produit tiers et ils sont lents à répondre aux questions. Je sais que les données se trouvent dans cette base de données, donc je veux faire un peu d'ingénierie inverse.
Est-il possible d'obtenir une liste des noms des colonnes d'une table donnée ?
Par exemple, dans SQL Server, il est possible de sauvegarder une table dans une instruction ```CREATE``` réutilisable, qui liste textuellement toutes les colonnes dont la table est composée
gpt
Le schéma d'information est le moyen sûr et lent : il est normalisé et largement portable vers d'autres bases de données qui le prennent en charge. Et cela continuera de fonctionner avec les principales versions.
Cependant, les vues dans le schéma d'information joignent souvent de nombreuses tables des catalogues système pour respecter un format strictement normalisé - dont beaucoup sont inutiles la plupart du temps. Cela les rend lentes.
Les développeurs de Postgres ne font pas de promesses, mais les bases (comme celle dont nous avons besoin ici) ne vont pas changer avec les principales versions.
Évaluation plus détaillée :

* Requête pour afficher les noms et les types de données d'une requête, d'une table ou d'une vue

```psql``` (l'interface en ligne de commande native) prend la voie rapide, bien sûr, et interroge directement la source. Si vous démarrez ```psql``` avec le paramètre ```-E```, le SQL derrière les commandes backslash comme ```\d``` est affiché. Ou ```\set ECHO_HIDDEN on``` depuis la ligne de commande psql. À partir de là, vous pouvez construire une réponse à votre question.

Pour une table donnée, est-il possible d'obtenir une liste des noms des colonnes de cette table.

```SELECT attrelid::regclass AS tbl
     , attname            AS col
     , atttypid::regtype  AS datatype
       -- plus d'attributs ?
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass  -- nom de la table éventuellement qualifié par le schéma
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;
```
Plus rapide que la requête sur ```information_schema.columns```. Essayez ```EXPLAIN ANALYZE``` pour le voir par vous-même. Cela importe peu pour une recherche ponctuelle. Mais cela peut faire une différence s'il est utilisé dans une requête / fonction qui est répétée de nombreuses fois.
Il y a aussi des différences subtiles de visibilité. L'article suivant propose une comparaison détaillée :

* Comment vérifier si une table existe dans un schéma donné