我正在尝试为社交媒体应用程序/网站的后端开发通知系统。现在我专注于状态更新。我要做的是在postgres表上设置一个与状态更新相关的触发器,以便每次发布新状态更新时,都会向我的代码发送通知。
到目前为止,我已经能够做到这一点。但是我想要实现的一个额外功能是提取跟随发布状态更新的用户的所有人,以便我也可以向他们发送通知,告知他们所关注的人已发布新的状态更新。
当然,它可以通过首先从postgres接收新状态更新的通知,提取发布它的人的用户ID,并向数据库查询以找出跟随它们的用户来实现。
但我认为如果我不进行查询会更有效率,相反,每次postgres想要向我发送有关新状态更新的通知时,它还会查询以查找哪些用户正在关注状态更新并发送该信息以及新状态更新的通知。
但我无法弄清楚如何在依赖于该函数的参数的postgres函数中进行查询,然后将该查询的结果与参数一起作为通知发送。
这就是我尝试过的:
create table example (c1 text, c2 text);
create function notif()
returns trigger as
$$
begin
perform pg_notify('event',row_to_json(new)::text);
return new;
end;
$$ language plpgsql;
create trigger trig after insert
on example
for each row execute procedure notif();
然后我从我的代码中听取事件通道并接收插入的行。但我想基于notif()函数中的新行执行select语句,并将带有新行的结果发送到监听代码。
我很感激任何澄清
谢谢
像这样的东西?
CREATE FUNCTION notif()
RETURNS TRIGGER AS $$
DECLARE
data JSONB;
result JSONB;
BEGIN
SELECT json_agg(tmp) -- requires Postgres9.3+
INTO data
FROM (
-- your subquery goes here, for example:
SELECT followers.following_user_id
FROM followers
WHERE followers.followed_user_id = NEW.user_id
) tmp;
result := json_build_object('data', data, 'row', row_to_json(NEW));
PERFORM pg_notify('event', result::TEXT);
RETURN NEW;
END;
$$ language plpgsql;
同样来自评论:
但不知何故神奇地使用
return new
行在通知中返回。
你误会了事情。退货和通知是两回事。
首先让我们处理回报。对于AFTER INSERT触发器,返回值完全被忽略:
始终忽略触发AFTER的行级触发器或BEFORE或AFTER触发的语句级触发器的返回值;它也可能是空的。
返回值仅对BEFORE触发器有用。在这种情况下,您可以在写入表之前修改(甚至阻止)该行。请参阅:https://www.postgresql.org/docs/9.2/plpgsql-trigger.html这与通知无关。
那么通知呢?无论你从通知中收到什么,你都会将你作为第二个参数传递给pg_notify
。所有这些都有很好的记录:https://www.postgresql.org/docs/9.0/sql-notify.html