将多个查询作为JSON对象一起返回,而不是多个查询

时间:2018-12-19 12:35:04

标签: postgresql express postgresql-10 pg-promise

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

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

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

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

但是,这些查询在概念上只共享最终应用程序所需要的任何东西。另外,调用array_to_jsonarray_agg会产生开销,这似乎与数据库逻辑背道而驰。

我正在考虑拆分查询,并在pg-promise中使用db.batch的{​​{1}}在查询之间共享相同的连接。

与第一种方法相比,有没有使用这种方法的警告?最佳的性能选择是什么?

1 个答案:

答案 0 :(得分:2)

从性能角度来看,最好是执行多个不相关的查询,这些查询通过单个多查询字符串作为单个事务/原子块返回数据。

模块pg-promise专门具有方法multi。而且,如果您需要传递格式参数,则可以将其作为常规变量传递,包括这次所有查询的索引/名称,也可以在灵活的辅助工具{{3的帮助下,为每个查询分别提供格式参数}}在单个命令中生成最终的多查询字符串:

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定义为函数,因此与格式相关的错误由查询方法封装,并在.catch内进行处理。