postgresql rpc函数告诉我重新加载模式缓存

carvr3hs  于 2023-02-15  发布在  PostgreSQL
关注(0)|答案(1)|浏览(104)

我创建了一个rpc函数来获取用户每个帖子的赞数,所以我创建了一个以userId为参数的函数,userId是会话中用户的uuid,但是当我调用前面的函数时,它返回我。
如果使用此名称和参数在数据库中创建了新函数,请尝试重新加载架构缓存。
该功能:

create function get_number_of_posts_by_user(userId uuid)
returns integer
as $$
  SELECT 
  count(pl.id)
  FROM 
  auth.users au
  join posts p on p.user_id = au.id
  join post_likes pl on pl.post_id = p.id
  where au.id = userId
$$ language sql;
shyt4zoc

shyt4zoc1#

获取用户每个帖子的喜欢数量
你需要分组邮递才能到那里。

CREATE OR REPLACE FUNCTION get_likes_per_post_for_user(_userid uuid)
  RETURNS TABLE (post_id uuid, likes bigint)  -- use actual type of post_id
  LANGUAGE sql AS
$func$
SELECT p.id, count(*)
FROM   posts      p 
JOIN   post_likes pl ON pl.post_id = p.id
WHERE  p.user_id = _userid
GROUP  BY 1
ORDER  BY 1;  -- or some other order?
$func$;

电话:

SELECT * FROM get_likes_per_post_for_user(<some_uuid>);

要点:

  • 完全不需要涉及users表,直接按posts.user_id过滤,更便宜。
  • count(*)〉〉count(pl.id)在这个例子中。也便宜一点。count(*) has a separate implementation在postgres中。
  • count()返回bigint,而不是integer。以某种方式匹配RETURNS声明的内容。
  • 避免函数参数和表列之间的命名冲突。参数前缀为_(列名决不能使用相同的前缀)是一个常见的约定。

和表限定列名。在这种情况下,避免OUT参数post_id(在查询中也可见)和post_likes.post_id之间的冲突。

  • 在计算点赞数时,不要调用函数"get_number_of_posts ..."。

您最初的问题可能是XY问题,通过正确的函数定义就可以解决。

解决标题问题

如果确实需要重新加载模式缓存,请使用:

SELECT pg_stat_clear_snapshot();

本手册:
您可以调用pg_stat_clear_snapshot()来丢弃当前事务的统计信息快照或缓存值(如果有)。下次使用统计信息时(在快照模式下)将生成新快照或(在缓存模式下)缓存访问的统计信息。
我自己从来没有过这样的需要,通常情况下,问题出在其他地方。

相关问题