当前位置: 首页 > 知识库问答 >
问题:

在plpgsql(postgresql)或python类中创建函数更好吗?

胡鸿志
2023-03-14

我有这个问题,我不知道我应该用plpgsql在Postgresql数据库上生成函数,还是应该在python/java上的类中生成函数,不管用什么语言编程

我的老板问我为什么要在plpgsql而不是python上编写函数,我无法给他一个可靠的答案,为什么它更好。

我谷歌了一下,但我找不到任何关于这个的信息。关于在plpgsql上执行函数,我唯一能想到的是,如果我改变了编程语言,我唯一需要做的就是调用函数,而不是在新语言上重写它。

这是我在stackoverflow成员的帮助下编写的一个plpgsql示例,我应该在python类中重写它,还是将其作为函数留在db中,然后从python类中调用该函数?

CREATE OR REPLACE FUNCTION createid(idslist varchar[], objecttype varchar)
RETURNS TABLE(original_id varchar, new_id varchar) as
$$
declare 
l_prefix text;
BEGIN
IF LOWER(objectType) = 'global' THEN
    l_prefix := 'GID';
ELSE
    l_prefix := 'ORG';
END IF;
RETURN QUERY
INSERT INTO idstable(original_id, new_id)
select t.x, l_prefix||nextval('mapSquema.globalid')::TEXT
from unnest(idslist) as t(x)
returning *
END;
$$ LANGUAGE plpgsql;

共有1个答案

段晨
2023-03-14

存储过程通常有一些优点:

  • 可以最大限度地减少将数据移动到客户端
  • 有可能减少网络流量,
  • 服务器端代码可以从不同的环境轻松访问,
  • 它有助于分解数据处理部分和数据表示部分。
  • 使用安全定义函数,您可以将安全性提高到没有存储过程无法实现的级别

有时这些特性很有趣,有助于开发非常快速且维护良好的应用程序。

 类似资料:
  • 我想定义一些东西,最好在Python中调用“函数扩展”/“函数接口”或“函数类”。我还没有在其他语言中见过类似的构造,但我不擅长LISP之类的函数式语言。如果这更容易做到,考虑以后改用其他语言,比如Julia。 “函数扩展”将是一种形式化的方式来表示绑定函数的几个参数,我们最终得到一个属于特定“函数类”的函数。在我下面的示例中,特定的“函数类”是一个数据转换函数(如),它只有一个参数:扩展了作为绑

  • 我对数据库开发非常陌生,因此我对以下示例有一些疑问: 函数f1()-语言sql 函数f2()-语言plpgsql > 这两个函数都可以像或一样调用。 如果我调用选择f1('world'),输出将是: 并为输出: 错误:查询没有结果数据的目的地提示:如果要丢弃SELECT的结果,请改为使用PERFORM。上下文:PL/pgSQL函数f11(字符变化)第2行SQL语句 ********** 错误 **

  • 问题内容: 我设法定义一个类A,使用另一个类B的实例列表作为类A的实例变量。B类具有更改A类的另一个实例变量a1的功能。类A还具有更改类B的实例变量bb的功能。因此,A类可以访问B类,而B类可以访问A类。这两个类嵌套在一起。我知道我们可以简化将B类的所有实例变量和函数更改为A类的事情。但是在我的项目中,这种嵌套结构才是真正的东西。 我想知道的是,这种嵌套类是否会降低python的效率?有更好的解决

  • 问题内容: 我创建了两种类型: 我想创建一个包含这两种类型的表。我知道对于由一种类型组成的表,它是: 对于我上面创建的两种类型,有什么方法可以做到这一点? 我尝试做的(错误的)是创建包含前两个的第三种类型: 然后创建表: 但这是行不通的。我收到此错误: 问题答案: 您不能成为的主键,因为唯一的列是两种复合类型和。您不能在子句中访问这些复合类型的基本类型。 您尝试执行的操作在或上有pk约束。 除此以

  • 问题内容: 数据库开发 是一个非常新的事物,因此我对以下示例有一些疑问: 函数f1()- 语言sql 函数f2()- 语言plpgsql 这两个 函数 都可以称为或。 如果我打电话, 输出 将是: 并 输出 为: 错误:查询没有结果数据的目的地提示:如果要舍弃SELECT的结果,请改用PERFORM。上下文:SQL语句 *上的 PL / pgSQL函数f11(字符变化)第2行 * 错误 ** 我想

  • 问题内容: 我正在尝试在循环内创建函数: 问题在于所有功能最终都相同。这三个函数都没有返回0、1和2,而是返回2: 为什么会发生这种情况,我应该怎么做才能获得分别输出0、1和2的3个不同函数? 问题答案: 你在后期绑定方面遇到了问题-每个函数都i尽可能晚地查找(因此,在循环结束后调用时,i将设置为2)。 可以通过强制早期绑定轻松修复:更改为以下形式: 缺省值(右手i输入i=i是参数名的默认值,i左