我正在使用PostgreSQL C API,libpq。我需要能够将PGresult*
中的值转换为Ruby中的等效数据类型。我目前只是选择所有数据并使用PQgetvalue()
,它为我提供了char*
,我可以将其转换为ruby字符串。这很简单。但是根据{{返回的OID,是否有人可以共享的任何示例,从char*
到int
,float
或double
进行类型转换。 1}}?
实际上,简而言之,我不知道如何解释OID,the documentation似乎没有给出任何指示。我找到了this page,但这无助于了解如何使用此OID在C API中进行类型转换。我猜这里有一个常量列表,我可以从中做出一个很大的转换语句吗?
答案 0 :(得分:12)
在问到这个之后我找到了答案。基本上有一个名为catalog / pg_type.h的文件,以及libpq-fe.h和postgres.h。您需要在包含libpq-fe.h和postgres.h之后加入,然后您可以访问TEXTOID
,BOOLOID
,INT4OID
等定义。
#include <stdio.h>
#include <postgres.h>
#include <libpq-fe.h>
#include <catalog/pg_type.h>
// ... snip ...
if (PQgetisnull(result, row, col)) {
// value is NULL, nothing more to do
} else {
char * value = PQgetvalue(result, row, col);
int length = PQgetlength(result, row, col);
switch (PQftype(result, col)) {
case INT2OID:
case INT4OID:
case INT8OID:
// process value as an integer
break;
default:
// just default to a text representation
}
}
您需要查看pg_type.h中的所有OID以实际拥有一个广泛的列表,或者只是测试您返回的基本SELECT 't'::boolean
类型查询等,并在您需要新的时候构建交换机类型支持。
答案 1 :(得分:3)
要从OID获取类型名称,只需将其转换为regtype
:
SELECT 700::oid::regtype -- real
要获取任何列的类型(或plpgsql中的变量),请使用pg_typeof()
:
SELECT pg_typeof(1::real) -- real
在psql或pgAdmin中为您提供regtype
类型的答案,displayed
为text
。如果需要,您可以明确地将其强制转换为text
:
SELECT pg_typeof(1::real)::text -- real
还有这个“大名单”,即vulgo目录表pg_type
,其中注册了类型。这可能很大,请看一眼:
SELECT * from pg_type LIMIT 10;