所以我有一个自定义的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;
在我的节点服务器中,我希望每次此查询中的行数发生更改时都会收到通知。我已经研究过使用像pg-live-query这样的Node库,但我更倾向于使用与现有的Postgres LISTEN / NOTIFY一起工作的pg-pubsub,以避免不必要的开销。但是,据我所知,PostgreSQL TRIGGERs
仅适用于UPDATE / INSERT / DELETE操作,而不适用于任何特定查询本身。有没有办法完成我正在做的事情?
答案 0 :(得分:1)
您需要设置正确的触发器,为在同一频道上使用NOTIFY
的所有客户端调用LISTEN
。
很难确定在触发器中如何准确实现NOTIFY
逻辑,因为它取决于以下内容:
根据答案,您可能会考虑不同的方法,包括但不限于以下选项及其组合:
payload
将更新详细信息传递给侦听器某些情况会变得非常复杂。例如,您可能有一个可以进行更改的主客户端,以及需要通知的多个从属服务器。在这种情况下,主服务器执行查询,检查结果是否已更改,然后调用PostgreSQL服务器中的函数以触发所有从服务器上的通知。
因此,根据手头任务的具体要求,可能会有很多变化。在您的情况下,您没有提供足够的详细信息来提供任何特定路径,但上述一般指导原则可以为您提供帮助。
答案 1 :(得分:0)
Async& LISTEN / NOTIFY是正确的方式!
您可以在UPDATE / INSERT上添加触发器,在触发器主体中执行查询,在简单表中保存行数,如果值更改了调用通知。如果在查询中需要多个参数组合,则可以从程序内部创建/销毁触发器。