我使用postgREST来生成一个http可访问的api (很棒的东西)。有个小虫子我正试着解决。
出于任何原因,在调用函数时,并且仅在函数参数中,我不能使用api
通常可以使用限定表示法(例如,core.my_type
)引用的类型。不过,它可以访问api.my_type
,当然不需要限定类型。
所以,要明确的是,所有这些都适用于postgres。这只是postgREST的一个怪癖。
随着时间的推移,一个容易出错的工作是复制/粘贴每种模式中每种类型的定义。
另一个是本文的主题:是否有一种方法可以自动将core
模式中的类型副本创建为api
中的一个副本?或者,是否有使用别名引用core.my_type
的方法?(不确定后者是否能解决问题,但也许值得一试)。
我意识到这需要在需要的地方铸造。但是,它确实解决了跟踪每个enums
中的条目的问题(在本例中)。
发布于 2022-05-13 08:19:04
出于任何原因,在调用函数时,并且仅在函数参数中,我不能使用api通常使用限定表示法引用的类型。
这是因为PostgREST在构建查询时使用CTE调用函数,并将数据转换为这些代码行中看到的参数类型。
有一个GitHub存储库中的封闭问题提到了这个问题,它被标记为won't fix
。
另一个是本文的主题:是否有一种方法可以自动将核心模式中的类型副本创建为api中的一个?或者,是否有使用别名引用core.my_type的方法?
您可以使用DOMAIN
作为解决方案。这样,在基础私有数据类型上使用ALTER
进行的任何修改都将反映在域上。例如:
create schema api;
create schema private;
create role web_anon nologin;
-- web_anon doesn't have usage on the private schema
grant usage on schema api to web_anon;
-- create type and domain
create type private.grade as enum('a','b','c','d','e');
create domain api.grade as private.grade;
-- The function uses the domain api.grade instead of private.grade
create or replace function
api.get_grade(g api.grade) returns text as $$
begin
return (select g);
end;
$$ language plpgsql;
-- This change will reflect on the domain
alter type private.grade add value 'f';
https://stackoverflow.com/questions/72218800
复制相似问题