我在supabase postgres工作并编写了多个postgres函数
DROP FUNCTION IF EXISTS setup_auth_user;
CREATE OR REPLACE FUNCTION setup_auth_user(
email_value TEXT,
name_value TEXT,
password_value TEXT,
wallet_address_value TEXT,
private_key_value TEXT
) RETURNS user_info AS $$
DECLARE
updated_user_info user_info;
BEGIN
INSERT INTO user_info (user_state, email, name, password, updated_at)
VALUES ('active'::user_state, email_value, name_value, password_value, now())
RETURNING * INTO updated_user_info;
insert into user_wallet_info (private_key, wallet_address, user_id)
VALUES (private_key_value, wallet_address_value, updated_user_info.id);
RETURN updated_user_info;
END;
$$ LANGUAGE plpgsql;
然后说这个
DROP FUNCTION IF EXISTS public.get_user_with_authenticator;
CREATE OR REPLACE FUNCTION public.get_user_with_authenticator(session_id_value text)
RETURNS jsonb
LANGUAGE sql
AS $function$
SELECT jsonb_build_object(
'email', u.email,
'name', u.name,
'id', u.id,
'user_state', u.user_state,
'credential_id', pa.credential_id,
'credential_public_key', pa.credential_public_key,
'counter', pa.counter,
'transports', pa.transports,
'challenge', p.passkey_challenge
)
FROM passkey_sessions AS p
LEFT JOIN user_info AS u ON u.email = p.email
LEFT JOIN passkey_authenticator AS pa ON pa.id = u.authenticator_id
WHERE p.session_id = session_id_value;
$function$;
我在后端调用插入函数,在前端调用
setup_auth_user
和get_user_with_authenticator
为此我收到了这个反馈
使用无状态查询似乎比每次编辑函数时都必须创建/更新函数更容易调试。您也不需要迁移来更改查询。
有人可以解释一下无状态查询是什么意思吗?如果这是一个好主意?
这听起来不像是反馈作者的问题,但我的理解是,stateful和stateless之间的查询区别,虽然不一定是任何官方/广泛使用的术语,但指的是你的函数的事实 -必须先定义包装查询并将其呈现在数据库上,然后才能使用
select
调用它,而原始/未包装/直接/无状态查询不需要。
“无状态”查询只需在发出该查询的应用程序代码中维护。如果您使用函数包装器,则需要在应用程序中维护使用
select
调用它的代码,以及数据库中的定义,并且要更改数据库,您需要迁移。当您更改某些内容时,您需要在两个位置更新代码,如果有大量配置为由迁移触发的前后步骤(备份、验证、完整性检查、测试),其中之一可能会很复杂/具有侵入性。如果直接使用查询,只需更改查询即可。
功能包装有一些优点,如果你来这里是为了弹药来反击这个反馈: