将不同的查询作为 JSON 对象与多个查询一起返回

Returning different queries together as a JSON object vs. multiple queries

我需要 运行 几个不相关的查询才能呈现页面。

到目前为止,我一直将每个查询结果转换为 JSON 对象,然后再将它们与以下形式的内容一起返回:

SELECT (SELECT array_to_json(array_agg(Q1)), (SELECT array_to_json(array_agg(Q2))

...因此生成一行,每列有一个查询结果。

然而,这些查询在概念上没有任何共享,只是最终应用程序共同需要它们。此外,调用 array_to_jsonarray_agg 产生的开销似乎与数据库逻辑相悖。

我正在考虑拆分查询并在 db.task 中使用 pg-promisedb.batch 以在查询之间共享相同的连接。

与第一种方法相比,使用这种方法有什么注意事项吗?什么是最好的性能?

就性能而言,最好通过单个多查询字符串执行多个不相关的查询,return 数据作为单个 transaction/atomic 块。

模块 pg-promise has method method multi specially for that. And if you need to pass in formatting parameters, you can either pass them in as usual variables, covering indexes/names of all queries this time, or you can supply formatting parameters separately for each query, with the help of flexible helper helpers.concat 在单个命令中生成最终的多查询字符串:

const queries = [
    {query: 'SELECT ...', values: ...},
    {query: 'SELECT ...', values: ...},
    {query: 'SELECT ...', values: ...}
    ...
];

const q = ()=> pgp.helpers.concat(queries);

db.multi(q)
    .then(([data1, data2, data3]) => {...})
    .catch(error => {...})

注意我们把q定义为一个函数,所以格式化相关的错误被query方法封装起来,在.catch.

中处理