将不同的查询作为 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_json
和 array_agg
产生的开销似乎与数据库逻辑相悖。
我正在考虑拆分查询并在 db.task
中使用 pg-promise
的 db.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
.
中处理
我需要 运行 几个不相关的查询才能呈现页面。
到目前为止,我一直将每个查询结果转换为 JSON 对象,然后再将它们与以下形式的内容一起返回:
SELECT (SELECT array_to_json(array_agg(Q1)), (SELECT array_to_json(array_agg(Q2))
...因此生成一行,每列有一个查询结果。
然而,这些查询在概念上没有任何共享,只是最终应用程序共同需要它们。此外,调用 array_to_json
和 array_agg
产生的开销似乎与数据库逻辑相悖。
我正在考虑拆分查询并在 db.task
中使用 pg-promise
的 db.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
.