Comment lister toutes les colonnes d'une table spécifiée

293

Je cherche une information précise dans une base de données que je ne connais pas.

Il s'agit d'un produit tiers. Ils répondent lentement à certaines questions et je sais que les données se trouvent à l'intérieur de cette base de données. Je souhaite donc faire un peu d'ingénierie rétro.

Avec une table, est-il possible d’avoir une liste des noms des colonnes de cette table?

Par exemple, dans SqlServer, il est possible de vider une table dans une CREATEinstruction réutilisable , qui répertorie sous forme de texte toutes les colonnes composant la table.

Stéphane Rolland
la source
Quel type d'accès avez-vous à la base de données?
dezso
@dezso, c'est sur une machine séparée, mais je peux me connecter et lancer la ligne de commande psql, avec les droits d'administrateur
Stephane Rolland
6
Si je vous comprends bien, vous êtes après \dt[+] table_namedans psql.
dezso
1
Nan. \ dt + ne semble pas afficher explicitement le nom des colonnes. il ajoute seulement un champ "Description".
Stéphane Rolland
12
mais \ d + nom de la table fonctionne!
Stephane Rolland

Réponses:

344

En plus de la ligne de commande que \d+ <table_name>vous avez déjà trouvée, vous pouvez également utiliser le schéma d'informations pour rechercher les données de colonne, en utilisant information_schema.columns:

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

Remarque: comme dans l'exemple ci-dessus, assurez-vous que les valeurs sont placées entre guillemets.

bhamby
la source
2
Dans psql, utilisez \x onou \pset expanded onpour rendre les résultats de la requête linéaires (au lieu de tabulaires) et ainsi plus faciles à lire stackoverflow.com/a/9605093/513397
anishpatel le
4
Dans les versions actuelles (essayé en 9.6), vous pouvez utiliser psql \d+ public.*pour obtenir la description (schéma + indeces / fkeys / triggers) de toutes vos tables et vues dans le publicschéma. Nous l'utilisons dans notre script de hook pré-commit pour garder trace des modifications apportées à la base de données par chaque commit.
Thalis K.
4
SELECT nom_colonne pour obtenir uniquement le nom de la colonne
Andrew
83

En complément des autres réponses, même une instruction SELECT qui ne renvoie aucune ligne exposera les noms de colonne à vous et au code de l'application.

select *
from table_name
where false;

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

Mike Sherrill 'Rappel de chat'
la source
Je suppose 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.
JohnMudd
Sauf pour les colonnes cachées, qui devaient être spécifiées pour être sélectionnées (comme pg_class.oid)
okutane
Sympa et simple. Je vous remercie.
timkofu
71

Le schéma d’information est la méthode la plus lente et la plus sûre: il est normalisé et largement transférable vers les autres bases de données qui le prennent en charge. Et cela continuera à fonctionner avec les principales versions.

Cependant, les vues dans le schéma d'information sont souvent associées à de nombreuses tables des catalogues système pour répondre à un format strictement normalisé, dont la plupart ne sont que du fret mort. Cela les ralentit .
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 commencez psqlavec le paramètre-E , le code SQL situé derrière les commandes antislash, \dest affiché. Ou à \set ECHO_HIDDEN onpartir 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 que l' interrogationinformation_schema.columns . Essayez EXPLAIN ANALYZEde 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:

Erwin Brandstetter
la source
2
Vraiment, comme ça, vous montrez -Eet montrez aux gens comment obtenir le SQL de psql.
Evan Carroll
6

psql sur PostgreSQL 11+

Si vous êtes à la recherche pour les types de colonnes sur une requête, vous pouvez utiliser psqll »\gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)
Evan Carroll
la source
0

PostgreSQL uniquement

Ceci est quelque peu hokey mais pourrait être un prétendant si vous recherchez le SQL le plus court possible:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

ou même plus court (en supposant qu'il y a au moins une ligne présente dans le tableau)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

La liste conserve l'ordre. Si vous ne vous souciez pas de la commande et que vous avez une hstoreextension installée, vous pouvez faire encore plus rapidement.

SELECT skeys(hstore(NULL::schema_name.table_name))
oᴉɹǝɥɔ
la source