所以我有一个自定义的 Postgresql 查询,它检索指定经度纬度半径内的所有行,如下所示:
SELECT *,
earth_distance(ll_to_earth($1,$2), ll_to_earth(lat, lng)) as distance_metres
FROM RoomsWithUsers
WHERE earth_box(ll_to_earth($1,$2), $3) @> ll_to_earth(lat, lng)
ORDER by distance_metres;
在我的 Node 服务器中,我希望每次查询中的行数发生变化时都能收到通知。我研究过使用 Node 库,例如 pg-live-query但我更愿意 pg-pubsub 与现有的 Postgres LISTEN/NOTIFY 一起工作,以避免不必要的开销。但是,据我所知,PostgreSQL TRIGGERs
仅适用于 UPDATE/INSERT/DELETE 操作,不适用于任何特定查询本身。有什么方法可以完成我正在做的事情吗?
最佳答案
您需要设置正确的触发器,为在同一 channel 上使用 LISTEN
的所有客户端调用 NOTIFY
。
很难建议您如何准确地在触发器中实现您的 NOTIFY
逻辑,因为它取决于以下内容:
- 该消息面向多少客户?
- 正在评估的查询有多大?
- 触发器能否知道查询的逻辑以对其进行评估?
根据答案,您可能会考虑不同的方法,包括但不限于以下选项及其组合:
- 无法评估结果时执行查询/ View ,并缓存结果
- 如果可以评估查询结果,则提供智能通知
- 使用
payload
将更新细节传递给监听器 - 安排查询/ View 重新运行以延迟执行,如果它很重
- 将整个通知作为一项单独的工作进行
某些场景可能会变得非常复杂。例如,您可能有一个可以进行更改的主客户端,以及需要通知的多个从属客户端。在这种情况下,master 执行查询,检查结果是否已更改,然后调用 PostgreSQL 服务器中的函数来触发所有 slave 的通知。
因此,根据手头任务的具体要求,可以有很多变化。在您的情况下,您没有提供足够的详细信息来提供任何特定路径,但上述一般准则应该对您有所帮助。
关于sql - 有什么方法可以使用 LISTEN 和 NOTIFY(或 NodeJS)实时监控 Postgresql 查询更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46898870/