我有一个实用程序,可以使用以下方法自省表列:
select column_name, data_type from information_schema.columns
where table_name=%s
如何将其扩展到内省物化视图的列?
我有一个实用程序,可以使用以下方法自省表列:
select column_name, data_type from information_schema.columns
where table_name=%s
如何将其扩展到内省物化视图的列?
您的查询有一些缺点/需要改进的地方:
表名在数据库中不是唯一的,您必须缩小到特定模式,否则可能会得到令人惊讶/误导/完全错误的结果。
将(可选)模式限定的表名转换为...更有效/更方便regclass
。见下文。
转换为regtype为您提供通用类型名称而不是内部类型名称。但这仍然只是基本类型。
改为使用系统目录信息函数format_type()
来获取包含修饰符的准确类型名称。
通过上述改进,您无需加入其他表。只是pg_attribute
。
删除的列驻留在目录中,直到表被清空(完全)。你需要排除那些。
SELECT attname, atttypid::regtype AS base_type
, format_type(atttypid, atttypmod) AS full_type
FROM pg_attribute
WHERE attrelid = 'myschema.mytable'::regclass
AND attnum > 0
AND NOT attisdropped; -- no dead columns
顺便说一句:信息模式中的视图仅适用于标准合规性和可移植性(无论如何都很少起作用)。如果您不打算切换您的 RDBMS,请坚持使用目录表,这显然更快- 并且更完整。
似乎 postgres 9.3 已将物化视图排除在 information_schema 之外。(有关讨论,请参见http://postgresql.1045698.n5.nabble.com/Re-Materialized-views-WIP-patch-td5740513i40.html。)
以下内容适用于自省:
select attname, typname
from pg_attribute a
join pg_class c on a.attrelid = c.oid
join pg_type t on a.atttypid = t.oid
where relname = %s and attnum >= 1;
该子句attnum >= 1
抑制系统列。我猜,类型名称是 pg_specific 这种方式,但对于我的目的来说已经足够了。