如何将单独的pg-promise查询组合成pg-promise中的一个结果

时间:2017-05-16 03:16:27

标签: node.js postgresql pg-promise

我是node和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
);

我的服务网址是/ api / family / 1(其中1是子ID)

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

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 

(使用上一个查询中子记录中的parent_id)

生成的JSON应该包含一个用于' parent'的条目,一个条目用于' child'以及一个条目的一个条目' follow'。

最好的方法是什么?我已经接近了,但未能做到正确。

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

====== UPDATE ==

根据另一篇文章,我决定尝试不同的方法 - 使用单个查询并让Postgres返回JSON。这是功能:

    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,server和application在json中是单独的条目,但至少可以这样做。

1 个答案:

答案 0 :(得分:1)

这么简单:

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
    });