在PostgreSQL函数中为计算字段使用Hasura会话

在PostgreSQL函数中为计算字段使用Hasura会话,postgresql,graphql,hasura,Postgresql,Graphql,Hasura,我创建了一个“收藏”功能,它类似于许多网站中常见的“喜欢”功能 共有3个表格: 具有主键UUID的“用户” 带有pk UUID的“照片” 带有pk user.UUID和post.UUID的“收藏夹” 相应的SQL为: CREATE TABLE public."user" ( id uuid DEFAULT public.gen_random_uuid() NOT NULL ); CREATE TABLE public."photo" ( id uuid DEFAULT pub

我创建了一个“收藏”功能,它类似于许多网站中常见的“喜欢”功能

共有3个表格:

  • 具有主键UUID的“用户”
  • 带有pk UUID的“照片”
  • 带有pk user.UUID和post.UUID的“收藏夹”
相应的SQL为:

CREATE TABLE public."user" (
    id uuid DEFAULT public.gen_random_uuid() NOT NULL
);
CREATE TABLE public."photo" (
    id uuid DEFAULT public.gen_random_uuid() NOT NULL
);
CREATE TABLE public."favorite" (
    userId uuid NOT NULL
    photoId uuid NOT NULL
);
现在,我想用一个计算字段
isFavorite
作为布尔值查询照片,当当前用户喜欢照片时,该值设置为true

因此,我创建了这个自定义SQL函数:

CREATE OR REPLACE FUNCTION public.isfavorite(photo photo, hasura_session json)
 RETURNS boolean
 LANGUAGE sql
 STABLE
AS $function$
SELECT EXISTS (
    SELECT *
    FROM public.favorite
    WHERE "userId" = (VALUES (hasura_session ->> 'x-hasura-role'))::uuid AND "photoId" = photo.uuid
)
$function$
我可以在Hasura中使用SQL创建此函数,但当我将此函数设置为照片表中的计算字段时,Hasura显示以下错误:

在表“photo”中:在计算字段“isFavorite”中:函数“isFavorite”被重载。不支持重载函数

我哪里出错了?我们可以构建一个返回布尔值的自定义函数吗?您如何构建最喜欢(或喜欢)的功能

已解决:数据库中有两个导致过载的
isFavorite
函数

因此,现在在照片模式中有一个
isFavorite
字段,但我需要提供
$args
,并将
hasura_session
作为参数。
如何在不需要填写参数的情况下提供hasura_会话?

您需要跟踪传递会话变量的计算列。

最近也增加了这一点。请确保您的版本为v1.3或更高版本。我还将更改函数以接受photo_row作为变量,而不是photo photo,这可能会导致PostgreSQL出现问题

CREATE OR REPLACE FUNCTION public.isfavorite(photo_row photo, hasura_session json)
 RETURNS boolean
 LANGUAGE sql
 STABLE
AS $function$
SELECT EXISTS (
    SELECT *
    FROM public.favorite
    WHERE "userId" = (VALUES (hasura_session ->> 'x-hasura-role'))::uuid AND "photoId" = photo.uuid
)
$function$

您需要跟踪传递会话变量的计算列。

最近也增加了这一点。请确保您的版本为v1.3或更高版本。我还将更改函数以接受photo_row作为变量,而不是photo photo,这可能会导致PostgreSQL出现问题

CREATE OR REPLACE FUNCTION public.isfavorite(photo_row photo, hasura_session json)
 RETURNS boolean
 LANGUAGE sql
 STABLE
AS $function$
SELECT EXISTS (
    SELECT *
    FROM public.favorite
    WHERE "userId" = (VALUES (hasura_session ->> 'x-hasura-role'))::uuid AND "photoId" = photo.uuid
)
$function$

请回答您的问题,并为有问题的表添加
CREATE TABLE
语句。@a_horse_,没有完成名称。但我不确定这对回答这个问题是否有用……那么计算列在哪里呢?计算列在表格照片上。我直接在Hasura控制台中完成了所有操作,而不是使用SQL。在照片表的create table语句中没有计算列。请回答您的问题,并为所讨论的表添加
create table
语句。@a_horse__,没有完成名称。但我不确定这对回答这个问题是否有用……那么计算列在哪里呢?计算列在表格照片上。我直接在Hasura控制台中完成了所有操作,而不是使用SQL。在photo tableThx的create table语句中没有计算列供您回答!这正是我在阅读了对Hasura 1.2.1端点的
v1/query
的响应后所做的。但我仍然需要提供args。如果我导出所有元数据,我可以看到session_参数未设置。有bug吗?好的,这个功能还没有发布:我看到这个功能在25天前被合并了。因为它也在文档中,我想它已经发布了。我没有试过。谢谢你的回答!这正是我在阅读了对Hasura 1.2.1端点的
v1/query
的响应后所做的。但我仍然需要提供args。如果我导出所有元数据,我可以看到session_参数未设置。有bug吗?好的,这个功能还没有发布:我看到这个功能在25天前被合并了。因为它也在文档中,我想它已经发布了。我实际上没有试过。