如何将单独的pg-promise查询合并到pg-promise中

我是新来的节点和pg-promise,并没有能够弄清楚如何得到三个相关查询的结果成一个json结果。

给出三个相关的表格:

父母实体

create table parent ( id bigint, name character varying ); 

一个小孩实体

 create table entity_2 ( id bigint, parent_id bigint, name character varying ); 

孩子和同事之间的许多桌子

 create table entity_2_entity_3 ( id bigint, child_id bigint, associate_id bigint ); 

子表的关联表

 create associate ( id bigint, name character varying ); 

而我的服务url是/ api / family / 1(其中1是子标识)

第一个查询是(返回一个结果):

 SELECT * FROM child WHERE id = $1 

(使用孩子ID参数)

第二个查询是(返回0到许多结果):

 SELECT a.* FROM associate a JOIN child_associate ca ON ca.associate_id = a.id JOIN child c ON c.id = b.child_id WHERE c.id = $1 

(使用id参数)

第三个查询是(返回孩子的父母

 SELECT * FROM parent where id = $1 

(使用先前查询中的子logging的parent_id)

生成的JSON应该包含一个“父”的条目,一个“子”的条目和一个“同事”数组的一个条目。

做这个的最好方式是什么? 我已经接近了,但还没有把握好。

先谢谢您的帮助。 任何顺便说一句 – 爱pg-promise! 很高兴我决定在node和pg-promise中编写整个back-en应用程序。

======更新======

基于另一篇文章,我决定尝试一种不同的方法 – 使用单个查询并让Postgres返回JSON。 这是function:

  var serverFamilyQuery = `SELECT json_build_object( 'id', s.id, 'name', s.name, 'server_environment', ( SELECT json_agg(json_build_object('id', se.id, 'name', se.name)) FROM salt.server_environment se WHERE se.id = s.id ), 'applications', ( SELECT json_agg(json_build_object('id', ap.id, 'name', ap.name)) FROM salt.application ap JOIN salt.server_application sa ON sa.application_id = ap.id WHERE sa.server_id = s.id ) ) result FROM salt.server s WHERE s.id = $1` function getServerFamily(req, res, next) { var serverID = parseInt(req.params.id); db.one(serverFamilyQuery, [serverID]) .then(data => { debug('data: %s', data); res.status(200) .json({ status: 'success', data: data, message: 'Retrieved Application Successfully' }); }) .catch(function (err) { return next(err); }); }; 

结果如下:

 { "status": "success", "data": { "result": { "id": 1, "name": "app01", "server_environment": [ { "id": 1, "name": "Via West" } ], "applications": [ { "id": 1, "name": "SnapApp" } ] } }, "message": "Retrieved Application Successfully" } 

正如我前面提到的,我宁愿server_environment,服务器和应用程序在json中是单独的条目,但至less这是有效的。

这件事很简单:

 db.task(function* (t) { const child = yield t.one('SELECT * FROM child WHERE id = $1', 123); const parent = yield t.one('SELECT * FROM parent WHERE id = $1', child.id); const associates = yield t.any('SELECT * FROM associate...'); return {child, parent, associates}; }) .then(data => { // success, data = {child, parent, associates} }) .catch(error => { // error });