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)