如何将单独的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 });