作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 node 和 pg-promise 的新手,一直无法弄清楚如何将三个相关查询的结果合并到一个 json 结果中。
给定三个相关表:
父实体
create table parent (
id bigint,
name character varying
);
一个子实体
create table entity_2 (
id bigint,
parent_id bigint,
name character varying
);
child 和同事之间的多对多表
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 是 child 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 参数)
第三个查询是(返回 child 的 parent
SELECT *
FROM parent
where id = $1
(使用之前查询中子记录的parent_id)
生成的 JSON 应包含一个“ parent ”条目、一个“ child ”条目和一个“同事”数组条目。
最好的方法是什么?我已经接近了,但还没能把它做好。
在此先感谢您的帮助。顺便说一下 - 喜欢 pg-promise!很高兴我决定在 Node 和 pg-promise 中编写整个后端应用程序。
======更新======
根据另一篇文章,我决定尝试一种不同的方法 - 使用单个查询并让 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、服务器和应用程序在 json 中是单独的条目,但至少这是可行的。
最佳答案
就这么简单:
db.task(async t => {
const child = await t.one('SELECT * FROM child WHERE id = $1', 123);
const parent = await t.one('SELECT * FROM parent WHERE id = $1', child.id);
const associates = await t.any('SELECT * FROM associate...');
return {child, parent, associates};
})
.then(data => {
// success, data = {child, parent, associates}
})
.catch(error => {
// error
});
关于node.js - 如何将单独的 pg-promise 查询组合成 pg-promise 中的一个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43991914/
我是一名优秀的程序员,十分优秀!