Comment puis-je lister toutes les colonnes d'un tableau donné?


158

Je recherche une information précise dans une base de données dont je n'ai aucune connaissance.

C'est un produit de tierce partie, ils sont lents à répondre à quelques questions, et je sais que les données se trouvent à l'intérieur de cette base de données, donc je veux faire un peu d'ingénierie rétro.

Étant donné une table, est-il possible d'avoir une liste des noms des colonnes pour cette table?

Par exemple dans SqlServer, il est possible de vider une table dans une instruction CREATE réutilisable, qui répertorie textuellement toutes les colonnes dont la table est composée.

  0

Quel type d'accès avez-vous à la base de données? 13 août. 122012-08-13 12:49:57

  0

@dezso, il est sur une machine séparée, mais je peux me connecter, et lancer la ligne de commande psql, avec les droits d'administrateur 13 août. 122012-08-13 12:54:37

+4

Si je vous comprends bien, vous êtes après '\ dt [+] table_name' dans' psql'. 13 août. 122012-08-13 13:03:09

+1

non. \ dt + ne semble pas afficher explicitement le nom des colonnes. il ajoute seulement un champ "Description". 13 août. 122012-08-13 13:16:51

+7

mais le nom de la table \ d + fonctionne! 13 août. 122012-08-13 13:18:12

197

En plus de la ligne de commande \d+ <table_name> vous avez déjà trouvé, vous pouvez aussi utiliser le Information Schema pour rechercher les données de la colonne, en utilisant information_schema.columns:

SELECT * 
FROM information_schema.columns 
WHERE table_schema = 'your_schema' 
    AND table_name = 'your_table' 

Note: Selon l'exemple ci-dessus, assurez-vous que les valeurs sont inclus entre guillemets.

  0

Dans psql, utilisez '\ x on' ou' \ pset expanded on' pour rendre les résultats de la requête linéaires (au lieu de tabulaires) et donc plus faciles à lire https://stackoverflow.com/a/9605093/513397 07 sept.. 172017-09-07 22:46:06

+1

Dans les versions actuelles (essayé en 9.6) vous pouvez faire dans psql '\ d + public. *' pour obtenir la description (schéma + indeces/fkeys/triggers) de toutes vos tables et vues dans le schéma 'public'. Nous l'utilisons dans notre script hook pré-commit pour garder trace des changements dans la base de données faite par chaque commit. 23 oct.. 172017-10-23 18:30:47

+1

SELECT nom_colonne pour obtenir uniquement le nom de la colonne 22 févr.. 182018-02-22 16:56:14


54

leinformation schemaC’est le moyen le plus lent et le plus sûr: il est normalisé et facilement transférable aux autres bases de données qui le prennent en charge.Et cela continuera à fonctionner avec les principales versions.

cependant,vuesdans le schéma d'information rejoignent souvent dans de nombreuses tables de lasystem catalogsrespecter un format strictement normalisé - dont beaucoup ne sont la plupart du temps que des marchandises mortes.Cela les rendlent.
Les développeurs de Postgres ne font pas de promesses, mais les bases (comme ce dont nous avons besoin ici) ne changeront pas d'une version à l'autre.

psql(l'interface de ligne de commande native) prend la voie rapide, bien sûr, et interroge directement la source.Si vous commencezpsql with the parameter -E, le SQL derrière les commandes de barre oblique inverse comme\dest affiché.Ou\set ECHO_HIDDEN onà partir de la ligne de commande psql.À partir de là, vous pouvez élaborer une réponse à votre question.

Étant donné une table, est-il possible d'avoir une liste des noms des colonnes pour cette table.

SELECT attrelid::regclass AS tbl
      , attname      AS col
      , atttypid::regtype AS datatype
       -- more attributes?
FROM  pg_attribute
WHERE attrelid = 'myschema.mytable'::regclass -- table name, optionally schema-qualified
AND  attnum > 0
AND  NOT attisdropped
ORDER BY attnum;

Plus rapide quequerying information_schema.columns.EssayerEXPLAIN ANALYZEpour voir par vous-même.Peu importe encore pour une recherche ponctuelle.Mais cela pourrait faire la différence si utilisé dans une requête/fonction répétée plusieurs fois.

Il existe également des différences subtiles de visibilité.Comparaison détaillée:

+1

Vraiment comme ça vous montrez -E et montrez aux gens comment obtenir le sql de psql. 02 déc.. 162016-12-02 20:31:40


52

En complément aux autres réponses, même une instruction SELECT qui retourne aucune ligne exposera les noms de colonnes pour vous et le code d'application.

select * 
from table_name 
where false; 

Des autorisations peuvent entrer en jeu avec l'une de ces approches.

  0

rapide et facile. meilleure réponse si j'ai juste besoin de voir une liste de colonnes. 26 janv.. 172017-01-26 18:23:54

  0

Je présume que vous voulez transmettre ce code SQL à la commande psql. Je suggère d'utiliser l'option --no-psqlrc dans ce cas pour éviter les surprises dans la sortie. 09 mars. 172017-03-09 19:37:28

  0

Meilleur, rapide et facile 04 déc.. 172017-12-04 10:31:13

  0

C'est le génie !! 01 févr.. 182018-02-01 10:07:26