【问题标题】:Is it possible to get the result of 2 queries in a single roundtrip with pg-promise?是否可以使用 pg-promise 在一次往返中获得 2 个查询的结果?
【发布时间】:2021-08-08 01:02:42
【问题描述】:

我正在开发一个无服务器应用程序 (AWS),这意味着运行我的代码的机器和运行我的数据库的机器可能在物理上是分开的。所以我必须确保单个 API 请求不会对服务器产生过多的往返。

所以我想知道,是否可以在一次往返服务器的过程中执行多个查询并接收响应?

类似这样的:

db.result("SELECT * FROM employees WHERE office=$1;DELETE FROM offices WHERE id=$1 RETURNING *",[office]);

这样员工和办公室都分别返回?如果我现在这样运行,只返回办公室。

【问题讨论】:

  • 你把事情搞混了。运行数据库和运行查询的机器通常在物理上是分开的。这与“无服务器”无关。而且您进行的往返次数没有任何区别,至少您的设置不会使往返次数减少本来就有利。所以......这似乎是一个XY问题。您实际上担心/试图解决与您正在谈论的问题不同的问题。
  • 好吧,由于它是无服务器的,AWS 可以处理机器的配置。所以不能保证数据库和逻辑共享一台机器。所以我认为只有最小化往返才有意义,因为即使在我的家庭网络上,我对路由器的 ping 也是 5 毫秒,这可能是执行查询所需的时间,从而使处理时间加倍。但我也没有经验可以肯定地说。所以你是说很多往返都没什么好担心的?
  • 不,我不是这么说的,但这是一个影响访问数据库服务器的任何 应用程序的问题,并且与AWS 无关。在过早优化之前,您应该对其进行测量并确保它实际上是您设置的缓慢部分。持久连接和连接池之类的东西可能已经很好地缓解了这种情况,并且在应用程序中向后弯曲以节省查询往返的效果可能不够大。
  • 是的,您首先测试它可能是对的

标签: node.js postgresql pg-promise


【解决方案1】:

是否可以在一次往返服务器的过程中执行多个查询并接收响应?

是的,库有 multi 方法:

const [employees, offices] = await db.multi(`SELECT * FROM employees WHERE office = $1; 
                          DELETE FROM offices WHERE id = $1 RETURNING *`, [office]);

【讨论】:

  • 它仍然只返回最后一个查询的结果: rows: [ { id: 1, name: 'Office A' } ],
  • @user2741831 Ops,我的意思是multi,而不是many,对此感到抱歉;现在更正;)
  • 感谢这项工作。不过,快速的问题是,这实际上是发送一个请求还是纯粹的语法糖(在代码中将其拆分并发送 2 个顺序请求)?我问是因为我知道多个请求在 node-pg 中无法本地工作。
  • 是前者 :) - 单个请求。
猜你喜欢
  • 2016-06-14
  • 2017-07-22
  • 2017-10-03
  • 2019-04-26
  • 2017-10-14
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多