Hasura插入repositories行时自动生成缓存行的实现方案咨询
实现插入repositories后自动添加缓存行的两种方案
如果不想用Hasura Events + Webhook的方式,有两种更轻量的方案可选:一种是通过Hasura配合Postgres自定义函数实现,另一种是直接用PostgreSQL触发器完成。
方案一:Hasura暴露Postgres自定义函数作为mutation
这种方式不需要外部服务,把插入主数据和缓存的逻辑封装在Postgres函数里,再通过Hasura暴露为mutation供用户调用:
- 创建Postgres函数,同时处理主表插入和缓存插入(假设缓存表名为
repository_caches,按需调整字段映射):
CREATE OR REPLACE FUNCTION insert_repo_with_cache(new_repo repositories) RETURNS repositories AS $$ BEGIN -- 插入主表并返回新增数据 INSERT INTO repositories VALUES (new_repo.*) RETURNING * INTO new_repo; -- 插入缓存表,根据实际缓存需求调整字段和逻辑 INSERT INTO repository_caches (id, name, url, cached_at) VALUES (new_repo.id, new_repo.name, new_repo.url, NOW()); RETURN new_repo; END; $$ LANGUAGE plpgsql VOLATILE;
- 在Hasura控制台进入
数据->函数,找到这个函数并点击跟踪,配置其作为mutation(设置返回类型为repositories)。 - 用户调用这个自定义mutation(如
insert_repo_with_cache)即可同时完成主数据和缓存的插入,无需额外操作。
方案二:PostgreSQL触发器自动处理
这种方案完全在数据库层面实现,用户无需修改原有调用方式,Hasura也不需要额外配置:
- 创建触发器函数,用于插入缓存行:
CREATE OR REPLACE FUNCTION insert_repo_cache() RETURNS TRIGGER AS $$ BEGIN -- 插入缓存表,按需调整字段和缓存逻辑 INSERT INTO repository_caches (id, name, url, cached_at) VALUES (NEW.id, NEW.name, NEW.url, NOW()); RETURN NEW; END; $$ LANGUAGE plpgsql VOLATILE;
- 给
repositories表绑定触发器:
CREATE TRIGGER trigger_insert_repo_cache AFTER INSERT ON repositories FOR EACH ROW EXECUTE FUNCTION insert_repo_cache();
- 配置完成后,用户正常调用
insert_repositories_onemutation时,PostgreSQL会自动触发函数插入缓存行,整个过程对用户和Hasura完全透明。
方案对比
- 方案一适合希望在Hasura层面统一数据插入入口的场景,用户需要切换到自定义mutation调用。
- 方案二更轻量化,性能更好,不需要改变原有调用流程,适合不需要在Hasura层干预的场景。
内容的提问来源于stack exchange,提问作者Itamar Smirra
相关产品推荐
相关产品推荐

