【问题标题】:Using Hasura session in PostgreSQL function for computed field在计算字段的 PostgreSQL 函数中使用 Hasura 会话
【发布时间】:2020-08-27 03:58:39
【问题描述】:

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

有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 显示此错误:

in table "photo": in computed field "isFavorite": function "isfavorite" is overloaded. Overloaded functions are not supported

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

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

所以现在照片模式中有一个isFavorite 字段,但我需要提供$argshasura_session 作为参数。 如何在不填写参数的情况下提供hasura_session?

【问题讨论】:

  • edit您的问题并为相关表格添加CREATE TABLE 语句。
  • @a_horse_with_no_name 完成。但我不确定这对回答这个问题是否非常有用......
  • 那么计算列在哪里?
  • 计算列在桌面照片上。我直接在 Hasura 控制台中完成所有操作,而不是使用 SQL。
  • photo表的create table语句中没有计算列

标签: postgresql graphql hasura


【解决方案1】:

您需要跟踪传递会话变量的计算列。
https://hasura.io/docs/1.0/graphql/manual/api-reference/schema-metadata-api/computed-field.html

{
    "type":"add_computed_field",
    "args":{
        "table":{
            "name":"photo",
            "schema":"public"
        },
        "name":"isfavorite",
        "definition":{
            "function":{
                "name":"isfavorite",
                "schema":"public"
            },
            "table_argument":"photo_row",
            "session_argument": "hasura_session"
        }
    }
}

这也是最近添加的。确保您使用的是 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$

【讨论】:

  • 感谢您的回答!这正是我阅读此github.com/hasura/graphql-engine/blob/… Hasura 1.2.1 端点的v1/query 后所做的事情是成功的。但我仍然需要提供参数。如果我导出所有元数据,我可以看到 session_argument 没有设置。有错误吗?
  • 好的,这个功能还没有发布:github.com/hasura/graphql-engine/issues/…
  • 我看到这个功能是25天前合并的。因为它也在文档中,所以我认为它已经发布了。我实际上并没有尝试过。
猜你喜欢
  • 1970-01-01
  • 2020-11-15
  • 2023-03-04
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多