Je « recherche une information précise dans une base de données dont je nai aucune connaissance.
Cest un produit tiers, ils sont lents à répondre à certaines questions, et je sais que les données se trouvent dans cette base de données, donc je veux faire un peu dingénierie rétro.
Étant donné une table, est-il possible davoir une liste des noms des colonnes pour cette table?
Par exemple dans SqlServer, il « est possible de vider une table dans un , qui répertorie textuellement toutes les colonnes dont le tableau est composé.
Commentaires
Réponse
En plus de la ligne de commande \d+ <table_name>
que vous avez déjà trouvée, vous pouvez utilisez également le Schéma dinformations 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" ;
Remarque: comme dans lexemple ci-dessus, assurez-vous que les valeurs sont entre guillemets.
Commentaires
- Dans psql, utilisez
\x on
ou\pset expanded on
pour effectuer la requête résultats linéaires (au lieu de tabulaires) et donc plus faciles à lire stackoverflow.com/a/9605093/513397 - 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 lepublic
schéma. Nous lutilisons dans notre script de hook pré-commit pour suivre les changements dans la base de données effectués par chaque commit. - SELECT column_name pour obtenir uniquement le nom de la colonne
Réponse
En complément des autres réponses, même une instruction SELECT qui ne renvoie aucune ligne vous exposera les noms des colonnes ainsi quau code de lapplication.
select * from table_name where false;
Les autorisations peuvent entrer en jeu avec lune de ces approches.
Commentaires
- Je suppose que vous voulez passer ce SQL à la commande psql. Je suggère dutiliser loption –no-psqlrc dans ce cas pour éviter les surprises dans la sortie.
- Sauf pour les colonnes cachées, qui ont dû être spécifiées pour être sélectionnées (comme pg_class.oid)
Réponse
Les information schema est le moyen lent et sûr: il est standardisé et largement portable vers dautres bases de données qui le supportent. Et il continuera à fonctionner dans toutes les versions majeures.
Cependant, les vues du schéma dinformation se rejoignent souvent de nombreuses tables des catalogues système pour répondre strictement format standardisé – dont beaucoup ne sont que du fret mort la plupart du temps. Cela les rend lents .
Les développeurs Postgres ne font pas de promesses, mais les bases (comme ce qui est nécessaire ici) ne va pas changer entre les versions principales.
psql
(linterface de 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 de barre oblique inverse telles que \d
sont affichées. Ou \set ECHO_HIDDEN on
à partir de la ligne de commande psql. À partir de là, vous pouvez construire une réponse à votre question.
Étant donné un tableau, est-il possible davoir une liste des noms des colonnes pour cela 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 interrogation information_schema.columns
. Essayez EXPLAIN ANALYZE
pour voir par vous-même. Cela na toujours pas dimportance pour une recherche ponctuelle. Mais peut faire une différence si elle est utilisée dans une requête / fonction répétée plusieurs fois.
Il existe également de subtiles différences de visibilité. Comparaison détaillée:
Commentaires
- Vraiment comme ça, vous montrez
-E
et montrez aux gens comment obtenir le sql de psql. - Je suis daccord.Jai effectué des tests de vitesse et le pg_catalog fonctionne plus de 2 fois plus vite
Answer
psql
sur PostgreSQL 11+
Si vous » recherchez les types de colonnes sur une requête, vous pouvez utiliser psql
« s \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)
Réponse
PostgreSQL uniquement
Ceci est un peu hokey mais pourrait être un concurrent 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 quau moins une ligne soit présente dans le tableau)
SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))
La liste préserve lordre. Si vous ne vous souciez pas de la commande et que lextension hstore
est installée, vous pouvez faire encore plus court
SELECT skeys(hstore(NULL::schema_name.table_name))
\dt[+] table_name
danspsql
.