如何处理 postgreSQL 中复合类型的变化
How to handle changes in composite type in postgreSQL
我即将学习 postgresql,我 运行 遇到了一些问题。我想通过存储过程(函数)建立从网站到数据库的大部分连接。到目前为止,我有大约 20 个函数,其中 5 个函数 returned 与列完全相同 table 即:
create or replace function my_Function( t text )
returns setof table(uid uuid,testText text, randomInt int ...)
...
因为 table(uid uuid,testText text, 运行domInt int ...) 重复了 5 次我发现我可以使用复合类型来 return 一样来自我的函数的数据类型,所以如果我需要 return 一个额外的列,我可以只更改我的复合类型和瞧,所有 5 个函数应该 return 相同的列。
不幸的是,这不是它的工作原理,一旦我向我的复合类型添加了一个新列,所有使用我的复合类型的函数都因 saem 错误而崩溃:
Final statement returns too few columns
这是有道理的,因为我没有 select 额外的列来适应复合类型。
有什么方法可以判断哪些函数使用复合类型作为 return 类型?
有什么方法可以强制复合类型为新创建的列填充空白(如果没有,那么我也可以使用 table(...) return 类型,因为它没有解决冗余我尽量避免的问题)?
示例设置:
create type my_type as (id int, name text);
create or replace function my_function_1()
returns setof my_type language plpgsql as $$
declare
rec my_type;
begin
rec.id := 1;
rec.name := 'name';
return next rec;
end $$;
create or replace function my_function_2()
returns setof my_type language plpgsql as $$
begin
return query select 1::int, 'name'::text;
end $$;
Are there any way to tell which functions use a composite type as return type?
是:
select nspname as schema_name, proname as function_name
from pg_proc p
join pg_namespace n on n.oid = pronamespace
join pg_type t on t.oid = prorettype
where typname = 'my_type';
schema_name | function_name
-------------+---------------
public | my_function_1
public | my_function_2
(2 rows)
Are there any way to force composite type to fill in blanks for newly created column?
没有。在向类型添加新属性后,您可以尝试重新创建(不修改)函数:
alter type my_type add attribute new_col int;
create or replace function my_function_1() ...
create or replace function my_function_2() ...
但只有 return 下一个变量类型的函数才能正常工作(my_function_1()
会工作,my_function_2()
不会)。
使用 Postgres 复合类型对您有什么好处?这似乎是一个痛苦的世界。我可以探讨这如何与 QueryFirst 一起使用吗?您的程序将在您的应用程序中的 .sql 文件中,与您的应用程序一起进行版本控制,并进行源代码控制。对于共享 return 类型的 5 个过程,您将创建一个 C# 接口。在 5 Results.cs 个文件中的每个文件中,在结果部分 class 上,继承接口。因此,这 5 个过程可以单独发展,根据需要添加列。如果您修改了一个过程,使其不再满足接口:编译错误。一个更宽容、更容忍变化的场景。
免责声明:我写了 QueryFirst
我即将学习 postgresql,我 运行 遇到了一些问题。我想通过存储过程(函数)建立从网站到数据库的大部分连接。到目前为止,我有大约 20 个函数,其中 5 个函数 returned 与列完全相同 table 即:
create or replace function my_Function( t text )
returns setof table(uid uuid,testText text, randomInt int ...)
...
因为 table(uid uuid,testText text, 运行domInt int ...) 重复了 5 次我发现我可以使用复合类型来 return 一样来自我的函数的数据类型,所以如果我需要 return 一个额外的列,我可以只更改我的复合类型和瞧,所有 5 个函数应该 return 相同的列。
不幸的是,这不是它的工作原理,一旦我向我的复合类型添加了一个新列,所有使用我的复合类型的函数都因 saem 错误而崩溃:
Final statement returns too few columns
这是有道理的,因为我没有 select 额外的列来适应复合类型。
有什么方法可以判断哪些函数使用复合类型作为 return 类型? 有什么方法可以强制复合类型为新创建的列填充空白(如果没有,那么我也可以使用 table(...) return 类型,因为它没有解决冗余我尽量避免的问题)?
示例设置:
create type my_type as (id int, name text);
create or replace function my_function_1()
returns setof my_type language plpgsql as $$
declare
rec my_type;
begin
rec.id := 1;
rec.name := 'name';
return next rec;
end $$;
create or replace function my_function_2()
returns setof my_type language plpgsql as $$
begin
return query select 1::int, 'name'::text;
end $$;
Are there any way to tell which functions use a composite type as return type?
是:
select nspname as schema_name, proname as function_name
from pg_proc p
join pg_namespace n on n.oid = pronamespace
join pg_type t on t.oid = prorettype
where typname = 'my_type';
schema_name | function_name
-------------+---------------
public | my_function_1
public | my_function_2
(2 rows)
Are there any way to force composite type to fill in blanks for newly created column?
没有。在向类型添加新属性后,您可以尝试重新创建(不修改)函数:
alter type my_type add attribute new_col int;
create or replace function my_function_1() ...
create or replace function my_function_2() ...
但只有 return 下一个变量类型的函数才能正常工作(my_function_1()
会工作,my_function_2()
不会)。
使用 Postgres 复合类型对您有什么好处?这似乎是一个痛苦的世界。我可以探讨这如何与 QueryFirst 一起使用吗?您的程序将在您的应用程序中的 .sql 文件中,与您的应用程序一起进行版本控制,并进行源代码控制。对于共享 return 类型的 5 个过程,您将创建一个 C# 接口。在 5 Results.cs 个文件中的每个文件中,在结果部分 class 上,继承接口。因此,这 5 个过程可以单独发展,根据需要添加列。如果您修改了一个过程,使其不再满足接口:编译错误。一个更宽容、更容忍变化的场景。
免责声明:我写了 QueryFirst