查询PostgreSQL中表的架构细节?

Dav*_*vid 7 postgresql types dynamic-sql information-schema

我需要知道PostgreSQL中的列类型(即varchar(20)).我知道我可能会\d在psql中使用某些内容找到它,但我需要使用select查询来完成它.
这在PostgreSQL中是否可行?

Erw*_*ter 11

在PostgreSQL中有一种更简单的方法来获取列的类型.

SELECT pg_typeof(col)::text FROM tbl LIMIT 1
Run Code Online (Sandbox Code Playgroud)

当然,该表必须至少保持一行.并且您只获得没有类型修饰符(如果有)的基本类型.如果您需要,也可以使用下面的替代方案.
您也可以将该函数用于常量.该手动pg_typeof().

对于一个空的(或任何)表,你可以使用查询系统目录pg_attribute获取列的完整列表,为了各自的类型:

SELECT attnum, attname AS column, format_type(atttypid, atttypmod) AS type
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytbl'::regclass   -- optionally schema-qualified
AND    NOT attisdropped
AND    attnum > 0
ORDER  BY attnum;
Run Code Online (Sandbox Code Playgroud)

在手动format_type()对象标识符的类型regclass.


Ale*_*DET 9

您可以使用postgres使用以下查询完整描述表:

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 ~ '^(TABLENAME)$'
   AND pg_catalog.pg_table_is_visible(c.oid)
  )
Run Code Online (Sandbox Code Playgroud)

通过此,您将检索列名称和数据类型.

也可以使用该-E选项启动psql客户端

$ psql -E
Run Code Online (Sandbox Code Playgroud)

然后一个简单的\d mytable输出postgres使用的查询来描述表.它适用于每个psql describe命令.

  • 我不认为你需要那个正则表达式匹配,`c.relname~'^(TABLENAME)$'`相当于`c.relname ='TABLENAME'.不错的回答. (2认同)