gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:19:52 26 4
gpt4 key购买 nike

我是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com