我需要从任意SQL查询中获取列类型。这当然是可能的,PgAdmin3做到了。
例如,给定一个查询:
SELECT src.col, CAST(src.col AS varchar)
FROM (SELECT 'anything' AS col) AS src;
PgAdmin3返回:
如您所见,列类型基于执行的查询而不是表模式显示。如何以编程方式获取结果集中列的数据类型?
答案 0 :(得分:3)
使用系统目录信息功能pg_typeof()
。
答案 1 :(得分:1)
C客户端库中的相应功能是PQftype
。它提供了查询中任何字段的类型,如Retrieving Query Result Information中所述,其他函数适用于结果字段,例如PQftable
或PQfsize
。
不需要EXPLAIN,这些信息随每一组结果一起发送回SQL客户端。
PQftype
Returns the data type associated with the given column number.
返回的整数是该类型的内部OID号。柱 数字从0开始。
Oid PQftype(const PGresult *res, int column_number);
您可以查询系统表pg_type以获取名称和属性 各种数据类型。内置数据的OID 类型在文件src / include / catalog / pg_type.h中定义 源树。
此外,所有类型的数据库的OID都可以通过以下方式获得:
select oid, typname from pg_type;
其他语言通常基于libgq库的postgres支持,因此他们可以调用此函数。它们可能会也可能不会暴露它,具体取决于它们的实施完成程度。
对于ruby,ruby-pg
驱动程序显然是通过PGResult来完成的
ftype(column_number)
实例方法。我不知道这对ActiveRecord是否有任何帮助。与数据库无关的API往往会遗漏在其支持的所有数据库中无法轻易抽象的功能。