Postgresql 避免将复合类型转换为文本

Postgresql 避免将复合类型转换为文本,postgresql,plpgsql,Postgresql,Plpgsql,从PLPGSQL函数返回时,我的复合类型将转换为文本: dev=# select * from app.user_query_test(3); user_record | udata_record -----------------+------------------- (3,875227490,t) | (3,3,"Bob Smith") (1 row) dev=# 我不希望这样,我希望在客户端将它们作为嵌套的数据对象接收,如下所示: { "user_re

PLPGSQL
函数返回时,我的复合类型将转换为文本:

dev=# select * from app.user_query_test(3);
   user_record   |   udata_record    
-----------------+-------------------
 (3,875227490,t) | (3,3,"Bob Smith")
(1 row)

dev=# 
我不希望这样,我希望在客户端将它们作为嵌套的数据对象接收,如下所示:

{
   "user_record": {
         "user_id": 3,
         "identity_id": 875227490,
         "utype": t
    },
    "udata_record": {
          "udata_id": 3,
          "user_id": 3,
          "full_name": "Bob Smith"
    }
}
但是,我也不想要
JSON
,因为解码/编码为
JSON
格式需要处理时间,并且会影响我的应用程序的性能。那么我该如何实现这一点呢?我的意思是,在没有任何解码/编码过程的情况下,如何将客户机上的数据按照
PLPGSQL
函数返回的确切结构放置

我的源文件是:

DROP TYPE IF EXISTS app.user_reply_t CASCADE;
CREATE TYPE app.user_reply_t AS (
    user_id         integer,
    identity_id     integer,
    utype           boolean
);
DROP TYPE IF EXISTS app.udata_reply_t CASCADE;
CREATE TYPE app.udata_reply_t AS (
    udata_id        integer,
    user_id         integer,
    full_name       varchar(64)
);
DROP TYPE IF EXISTS app.user_info_t CASCADE;
CREATE TYPE app.user_info_t AS (
    user_record     app.user_reply_t,
    udata_record    app.udata_reply_t
);
CREATE OR REPLACE FUNCTION app.user_query_test(p_user_id integer) 
RETURNS app.user_info_t AS 
$$
DECLARE
    rec             app.user_info_t;
BEGIN
    SELECT user_id,identity_id,utype FROM "comp-158572724".users WHERE user_id=p_user_id INTO rec.user_record;
    SELECT udata_id,user_id,full_name FROM "comp-158572724".udata WHERE user_id=p_user_id INTO rec.udata_record;
    RETURN rec;
END;
$$ LANGUAGE plpgsql;
使用Node.js进行测试:

 src $ node usertest.js 
result={ command: 'SELECT',
  rowCount: 1,
  rows: 
   [ { user_record: '(3,875227490,t)',
       udata_record: '(3,3,"Bob Smith")' } ],
  fields: 
   [ { name: 'user_record', dataTypeID: 19862 },
     { name: 'udata_record', dataTypeID: 19865 } ] }
^C
 src $ 
客户端代码的来源:

src $ cat usertest.js 
const util = require('util');
pg = require('pg').native
var Pool = pg.Pool
var Client = pg.Client
var pool=new Pool({
    user:     'dev_user',
    password: 'dev',
    host:     'localhost',
    database: 'dev'
});

pool.query('select * from app.user_query_test(3)',function(err, result) {
        console.log('result=' + util.inspect(result));
    }
);
function wait() {
    console.log('wating...');
    setTimeout(wait,3000);
}
setTimeout(wait,3000);
 src $ 

@但是这将不保留数据结构,只保留一个字段数组。我想要的是在客户端以user_record.fieldX的形式获取它。不确定不解码/编码结果是否可行。但是,在问题中添加
node.js
标记。@Abelisto,但这与node.js无关,如果我要使用Java或PHP,我需要同样的东西。告诉我如何用PHP做同样的事情,我会接受答案。PostgreSQL提供了“字段类型”-“字段值”对。客户端软件可以(或不能)根据“字段类型”将值转换为其特定的数据类型。所以我的建议是:使用JSON,因为它是JS的原生版本。@Abelisto,太糟糕了。我认为可以使用原生Postgres协议向客户端交付用户定义的类型,而无需额外的解码/编码过程。