是否可以将枚举类型从一个模式复制到另一个模式



我使用postgREST生成一个http可访问的api(伟大的东西)。有一个小错误,我正在努力解决。

无论出于何种原因,当调用函数时,并且仅在函数参数中,我不能使用api通常可以使用限定符号引用的类型,例如core.my_type。但是,它可以访问api.my_type,当然我不需要限定类型。

所以,为了清楚,这一切都在postgres中工作。这只是postgREST的一个怪癖。

随着时间的推移,一种容易出错的解决方法是复制/粘贴每个模式中每种类型的定义。

另一个是这篇文章的主题:是否有一种方法可以自动创建core模式中类型的副本到api中的副本?或者,是否有一种方法来引用core.my_type使用别名?(不确定后者是否能解决问题,但也许值得一试)。

我意识到需要在需要的地方进行强制转换。但是,它确实解决了跟踪每个enums中的条目的问题(在本例中)。

无论出于何种原因,在调用函数时,仅在函数参数中,我不能使用api通常可以使用限定符号引用的类型

这是因为PostgREST在构建查询时使用CTE来调用函数,并将数据强制转换为参数的类型,如以下代码行所示。

GitHub仓库中有一个封闭的问题提到了这个问题,标记为won't fix

另一个是这篇文章的主题:是否有一种方法可以自动在核心模式中创建类型的副本到api中的副本?或者,是否有一种方法可以引用核心。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';

最新更新