d11*_*wtq 9 c postgresql libpq
我正在使用PostgreSQL C API,libpq.我需要能够将a中的值转换为PGresult*
Ruby中的等效数据类型.我目前只是选择所有数据并使用PQgetvalue()
,这给了我一个char*
我可以转换成ruby String的东西.这很简单.但是否有任何的例子有人可以共享从做一个类型转换char*
,比方说,int
,float
或者double
,根据OID由归国PQftype()
?
实际上,简而言之,我不知道如何解释OID,文档似乎没有给出任何指示.我找到了这个页面,但这无助于理解如何使用此OID在C API中进行类型转换.我猜这里有一个常量列表,我可以从中做出一个很大的转换声明吗?
d11*_*wtq 13
问这个之后我找到了答案.基本上有一个名为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
}
}
Run Code Online (Sandbox Code Playgroud)
您需要查看pg_type.h中的所有OID以实际拥有一个扩展列表,或者仅测试您返回的基本SELECT 't'::boolean
类型查询等,并仅在您需要新类型支持时构建交换机.
要从 OID 获取类型名称,只需将其转换为regtype
:
SELECT 700::oid::regtype -- real
Run Code Online (Sandbox Code Playgroud)
要获取任何列(或 plpgsql 中的变量)的类型,请使用pg_typeof()
:
SELECT pg_typeof(1::real) -- real
Run Code Online (Sandbox Code Playgroud)
regtype
给你一个类似于psql 或 pgAdmindisplayed
类型的答案。如果需要,text
您可以将其显式转换为:text
SELECT pg_typeof(1::real)::text -- real
Run Code Online (Sandbox Code Playgroud)
还有这个“大列表”,vulgo 目录表pg_type
,其中注册了类型。这可能很大,看一下:
SELECT * from pg_type LIMIT 10;
Run Code Online (Sandbox Code Playgroud)