web-dev-qa-db-fra.com

Comment obtenir une liste de noms de colonnes et le type de données d'une table dans PostgreSQL?

Avec la requête suivante, nous pouvons obtenir une liste des noms de colonnes et le type de données d'une table dans PostgreSQL.

33
Pratik
SELECT
        a.attname as "Column",
        pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
    FROM
        pg_catalog.pg_attribute a
    WHERE
        a.attnum > 0
        AND NOT a.attisdropped
        AND a.attrelid = (
            SELECT c.oid
            FROM pg_catalog.pg_class c
                LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relname ~ '^(hello world)$'
                AND pg_catalog.pg_table_is_visible(c.oid)
        );

Change the hello world with your table name

Plus d'informations à ce sujet: http://www.postgresql.org/docs/9.3/static/catalog-pg-attribute.html

12
Pratik

Ouvrez la ligne de commande psql et tapez:

\d+ table_name
57
Marouane Afroukh
select column_name,data_type 
from information_schema.columns 
where table_name = 'table_name';

avec la requête ci-dessus, vous pouvez colonnes et son type de données

52
selva

Réponse Pratik mise à jour pour supporter plus de schémas et de valeurs nullables:

SELECT
    "pg_attribute".attname                                                    as "Column",
    pg_catalog.format_type("pg_attribute".atttypid, "pg_attribute".atttypmod) as "Datatype",

    not("pg_attribute".attnotnull) AS "Nullable"
FROM
    pg_catalog.pg_attribute "pg_attribute"
WHERE
    "pg_attribute".attnum > 0
    AND NOT "pg_attribute".attisdropped
    AND "pg_attribute".attrelid = (
        SELECT "pg_class".oid
        FROM pg_catalog.pg_class "pg_class"
            LEFT JOIN pg_catalog.pg_namespace "pg_namespace" ON "pg_namespace".oid = "pg_class".relnamespace
        WHERE
            "pg_namespace".nspname = 'schema'
            AND "pg_class".relname = 'table'
    );
2
Honza Kuchař

N'oubliez pas d'ajouter le nom du schéma si vous avez plusieurs schémas portant le même nom de table.

SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'your_table_name' and table_schema = 'your_schema_name';

ou en utilisant psql:

\d+ your_schema_name.your_table_name

2
BatCat

Pour obtenir des informations sur la colonne de la table, vous pouvez utiliser:

\dt+ [tablename]

Pour obtenir des informations sur le type de données dans la table, vous pouvez utiliser:

\dT+ [datatype]
1
bizi

sélectionnez nom_colonne, type_données à partir de informations_schema.columns où nom_table = 'nom_table_table' et table_catalog = 'nom_votre_base_données' et table_schema = 'nom_votre_schéma';

    SELECT DISTINCT
        ROW_NUMBER () OVER (ORDER BY pgc.relname , a.attnum) as rowid , 
        pgc.relname as table_name ,
        a.attnum as attr,
        a.attname as name,
        format_type(a.atttypid, a.atttypmod) as typ,
        a.attnotnull as notnull, 
        com.description as comment,
        coalesce(i.indisprimary,false) as primary_key,
        def.adsrc as default
    FROM pg_attribute a 
    JOIN pg_class pgc ON pgc.oid = a.attrelid
    LEFT JOIN pg_index i ON 
        (pgc.oid = i.indrelid AND i.indkey[0] = a.attnum)
    LEFT JOIN pg_description com on 
        (pgc.oid = com.objoid AND a.attnum = com.objsubid)
    LEFT JOIN pg_attrdef def ON 
        (a.attrelid = def.adrelid AND a.attnum = def.adnum)
    LEFT JOIN pg_catalog.pg_namespace n ON n.oid = pgc.relnamespace

    WHERE 1=1 
        AND pgc.relkind IN ('r','')
        AND n.nspname <> 'pg_catalog'
        AND n.nspname <> 'information_schema'
        AND n.nspname !~ '^pg_toast'

    AND a.attnum > 0 AND pgc.oid = a.attrelid
    AND pg_table_is_visible(pgc.oid)
    AND NOT a.attisdropped
    ORDER BY rowid
    ;
0
Yordan Georgiev