在计算字段的 PostgreSQL 函数中使用 Hasura session
Using Hasura session in PostgreSQL function for computed field
我创建了一个 "favorite" 功能,它类似于许多网站中常见的 "Like" 功能。
有3个table:
- "User" 主键 UUID
- "Photo" 与 pk UUID
- "Favorite" 与 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 创建此函数,但是当我将此函数设置为照片 table 中的计算字段时,Hasura 显示此错误:
in table "photo": in computed field "isFavorite": function "isfavorite" is overloaded. Overloaded functions are not supported
我哪里弄错了?我们可以构建一个 return 布尔值的自定义函数吗?您如何构建最喜欢(或喜欢)的功能?
已解决:数据库中有两个 isFavorite
函数导致过载...
现在照片架构中有一个 isFavorite
字段,但我需要提供 $args
和 hasura_session
作为参数。
如何提供hasura_session而不需要填写参数?
您需要跟踪传递会话变量的计算列。
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$
我创建了一个 "favorite" 功能,它类似于许多网站中常见的 "Like" 功能。
有3个table:
- "User" 主键 UUID
- "Photo" 与 pk UUID
- "Favorite" 与 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 创建此函数,但是当我将此函数设置为照片 table 中的计算字段时,Hasura 显示此错误:
in table "photo": in computed field "isFavorite": function "isfavorite" is overloaded. Overloaded functions are not supported
我哪里弄错了?我们可以构建一个 return 布尔值的自定义函数吗?您如何构建最喜欢(或喜欢)的功能?
已解决:数据库中有两个 isFavorite
函数导致过载...
现在照片架构中有一个 isFavorite
字段,但我需要提供 $args
和 hasura_session
作为参数。
如何提供hasura_session而不需要填写参数?
您需要跟踪传递会话变量的计算列。
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$